10

在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),))

在 python 2 中,numpy 标量整数数据类型不再是 int 的实例,甚至将整数值浮点数转换为 int。

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

这就是 dbapi 不再与 numpy 无缝协作的原因吗?

4

3 回答 3

10

根据 sqlite3 文档:

要将其他 Python 类型与 SQLite 一起使用,您必须将它们调整为 sqlite3 模块支持的 SQLite 类型之一: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),))

文档

于 2016-08-23T16:21:51.827 回答
5

而不是:

sqlite3.register_adapter(np.int64, lambda val: int(val))

您可以使用:

sqlite3.register_adapter(np.int64, int)
于 2018-11-25T22:05:29.893 回答
-1

使用 .item() 方法。

np.int64(100).item()

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

有关使用 .item() 方法进行 numpy 类型转换的参考,请参阅https://numpy.org/doc/stable/reference/generated/numpy.ndarray.item.html#numpy.ndarray.item

于 2021-03-15T03:23:01.723 回答