【发布时间】:2016-12-09 18:34:27
【问题描述】:
在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 无缝协作的原因吗?
【问题讨论】:
-
一个numpy整数类型不仅仅是数字的字节表示(它是
.item()值);是一个对象,几乎等同于单个元素,0d,数组。因此,我认为您无法将其所有 numpy 的荣耀保存在数据库中。你可以保存它的整数值,或者一个等效的字节,但不能保存完整的 numpy 对象。sqlite3中是否有关于保存用户定义的对象实例的内容? -
总是有可怕的 pickle 方法(针对 TEXT 类型),或者更现代和基于二进制的方法,例如 MessagePack(针对 BLOB 类型)。
-
保存
np.int64(100)而不是100有什么好处?是否有一些在获取期间无法恢复的有用信息?你可以看看像 SQLAlchemy 这样的模块是如何处理 sql-object 接口的。 -
stackoverflow.com/questions/18621513/… 是之前 SO 问题的一个示例。保存整个数组的解决方案是将
np.save写入 byteString 并将其保存为数据库中的自定义类型。搜索sqlite3和numpy。 -
Py3 去掉了整数和长整数的区别。所以一些 numpy 整数 dtypes 不再是
integer的子类。浮动仍然是子类。你还能保存浮点数组的元素吗?
标签: python sqlite python-3.x numpy python-db-api