使用python3将numpy整数类型插入sqlite

使用python3将numpy整数类型插入sqlite,python,sqlite,python-3.x,numpy,python-db-api,Python,Sqlite,Python 3.x,Numpy,Python Db Api,在Python3中,将numpy integer对象的值插入数据库的正确方法是什么?在Python2.7中,numpy数值数据类型可以干净地插入sqlite,但在Python3中却没有 import numpy as np import sqlite3 conn = sqlite3.connect(":memory:") conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))") conn.execute("i

在Python3中,将numpy integer对象的值插入数据库的正确方法是什么?在Python2.7中,numpy数值数据类型可以干净地插入sqlite,但在Python3中却没有

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
在Python2中,numpy标量整数数据类型不再是int的实例,甚至将整数值浮点数转换为int

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

isinstance(np.int64(1),int)#根据sqlite3文档:

要在SQLite中使用其他Python类型,必须使它们适应SQLite的sqlite3模块支持的类型之一:NoneType、int、float、str、bytes中的一种

因此,您可以调整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),))
而不是:

sqlite3.register_adapter(np.int64, lambda val: int(val))
您可以使用:

sqlite3.register_adapter(np.int64, int)
使用.item()方法

此解决方案的优点是可移植,而不是特定于sqlite3


有关使用.item()方法进行numpy类型转换的参考,请参阅

numpy整数类型不仅仅是数字的字节表示形式(它是
.item()
值);是一个对象,几乎与单个元素0d数组相同。所以我不认为你能把它保存在数据库里。您可以保存它的整数值或某个字节的等效值,但不能保存完整的numpy对象。
sqlite3
中是否有关于保存用户定义对象实例的内容?总是有可怕的pickle方法(针对文本类型)或更现代的二进制方法(针对BLOB类型)。保存
np.int64(100)
而不是
100
有什么好处?是否存在一些在获取过程中无法恢复的有用信息?您可以看看像SQLAlchemy这样的模块是如何处理sql对象接口的。是前面SO问题的一个示例。保存整个数组的解决方案是将
np.save
写入byteString,并将其作为自定义类型保存在数据库中。搜索
sqlite3
numpy
。Py3删除了整数和长字符之间的区别。因此,一些numpy整数数据类型不再是
integer
的子类。浮动仍然是子类。您仍然可以保存浮点数组的元素吗?
sqlite3.register_adapter(np.int64, int)
np.int64(100).item()