使用 python3 将 numpy 整数类型插入 sqlite
inserting numpy integer types into sqlite with python3
在 python 3 中,将 numpy 整数对象的值插入数据库的正确方法是什么?在 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
np.float 类型在 2 和 3 中似乎仍然工作得很好。
conn.execute("insert into foo values(?)", (np.float64(101),))
在python2中,numpy标量整数数据类型不再是int的实例,甚至将整数值浮点数转换为int。
isinstance(np.int64(1), int) # <- true for 2, false for python 3
这就是 dbapi 不再与 numpy 无缝工作的原因吗?
根据 sqlite3 文档:
To use other Python types with SQLite, you must adapt them to one of the sqlite3 module’s supported types for SQLite: one of NoneType, int, float, str, bytes.
所以你可以adapt 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() 方法。
np.int64(100).item()
此解决方案的优点是可移植且不特定于 sqlite3。
有关使用 .item() 方法进行 numpy 类型转换的参考,请参阅 https://numpy.org/doc/stable/reference/generated/numpy.ndarray.item.html#numpy.ndarray.item
在 python 3 中,将 numpy 整数对象的值插入数据库的正确方法是什么?在 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
np.float 类型在 2 和 3 中似乎仍然工作得很好。
conn.execute("insert into foo values(?)", (np.float64(101),))
在python2中,numpy标量整数数据类型不再是int的实例,甚至将整数值浮点数转换为int。
isinstance(np.int64(1), int) # <- true for 2, false for python 3
这就是 dbapi 不再与 numpy 无缝工作的原因吗?
根据 sqlite3 文档:
To use other Python types with SQLite, you must adapt them to one of the sqlite3 module’s supported types for SQLite: one of NoneType, int, float, str, bytes.
所以你可以adapt 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() 方法。
np.int64(100).item()
此解决方案的优点是可移植且不特定于 sqlite3。
有关使用 .item() 方法进行 numpy 类型转换的参考,请参阅 https://numpy.org/doc/stable/reference/generated/numpy.ndarray.item.html#numpy.ndarray.item