2016-08-03 50 views
5

在Python 3中将numpy整数对象的值插入到数据库中的正确方法是什么?在Python 2.7 numpy的数值数据类型插入到干净sqlite的,但他们没有在Python 3将numpy整数类型插入到python3的sqlite中

import numpy as np 
import sqlite3 
conn = sqlite3.connect(":memory:") 
conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))") 
conn.execute("insert into foo values(?)", (np.int64(100),)) # <-- Fails in 3 

的np.float类型似乎都在2和3

conn.execute("insert into foo values(?)", (np.float64(101),)) 

依然工作得很好在Python 2中,numpy标量整数数据类型不再是int的实例,即使将整数值浮点数转换为整数。

isinstance(np.int64(1), int) # <- true for 2, false for python 3 

这就是为什么dbapi不再能够与numpy无缝协作的原因吗?

+0

一个numpy的整数类型不仅是数量的字节表示(它的'.item()'值);是一个对象,几乎与单个元素0d,数组相同。所以我不认为你可以将它保存在数据库中的所有荣誉之中。你可以保存它的整数值,或者相​​当于一些字节,但不能保存完整的numpy对象。 'sqlite3'中有没有关于保存用户定义对象实例的内容? – hpaulj

+0

总是有一些吓人的pickle-approach(针对TEXT类型),或者像[MessagePack](http://msgpack.org/)(针对BLOB类型)的更现代和基于二进制的东西。 – sascha

+0

保存'np.int64(100)'而不是'100'有什么好处?是否有一些有用的信息在抓取过程中无法恢复?你可以看看SQLAlchemy这样的模块如何处理sql对象接口。 – hpaulj

回答

4

根据sqlite3的文档:

要使用其他Python类型的SQLite的,你必须适应他们SQLite的了sqlite3的模块支持的类型之一:NoneType之一,整数,浮点,STR,字节。

所以,你可以适应np.int64类型。你应该做这样的事情:

import numpy as np 
import sqlite3 

sqlite3.register_adapter(np.int64, lambda val: int(val)) 
conn = sqlite3.connect(":memory:") 
conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))") 
conn.execute("insert into foo values(?)", (np.int64(100),)) 

Docs