将numpy整数对象的值插入到python 3中的数据库的正确方法是什么?在python 2.7 numpy numeric数据类型中干净地插入sqlite,但它们不在python 3中
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 :(得分:6)
根据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),))
答案 1 :(得分:0)
而不是:
sqlite3.register_adapter(np.int64, lambda val: int(val))
您可以使用:
sqlite3.register_adapter(np.int64, int)
答案 2 :(得分:-1)
使用 .item() 方法。
np.int64(100).item()
此解决方案的优点是可移植且不特定于 sqlite3。
有关使用 .item() 方法进行 numpy 类型转换的参考,请参阅 https://numpy.org/doc/stable/reference/generated/numpy.ndarray.item.html#numpy.ndarray.item