使用 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),))

Docs

而不是:

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