Dav*_*hme 8 python sqlite numpy python-3.x python-db-api
将numpy整数对象的值插入到python 3中的数据库的正确方法是什么?在python 2.7中,numpy数值数据类型干净地插入到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
Run Code Online (Sandbox Code Playgroud)
np.float类型在2和3中似乎仍然可以正常工作.
conn.execute("insert into foo values(?)", (np.float64(101),))
Run Code Online (Sandbox Code Playgroud)
在python 2中,numpy标量整数数据类型不再是int的实例,甚至将整数值浮点数转换为整数.
isinstance(np.int64(1), int) # <- true for 2, false for python 3
Run Code Online (Sandbox Code Playgroud)
这就是dbapi无法与numpy无缝协作的原因吗?
根据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),))
Run Code Online (Sandbox Code Playgroud)
小智 5
而不是:
sqlite3.register_adapter(np.int64, lambda val: int(val))
Run Code Online (Sandbox Code Playgroud)
您可以使用:
sqlite3.register_adapter(np.int64, int)
Run Code Online (Sandbox Code Playgroud)