【问题标题】:inserting numpy integer types into sqlite with python3使用python3将numpy整数类型插入sqlite
【发布时间】: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 并将其保存为数据库中的自定义类型。搜索sqlite3numpy
  • Py3 去掉了整数和长整数的区别。所以一些 numpy 整数 dtypes 不再是integer 的子类。浮动仍然是子类。你还能保存浮点数组的元素吗?

标签: python sqlite python-3.x numpy python-db-api


【解决方案1】:

根据 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),))

Docs

【讨论】:

    【解决方案2】:

    而不是:

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

    你可以使用:

    sqlite3.register_adapter(np.int64, int)
    

    【讨论】:

      【解决方案3】:

      使用 .item() 方法。

      np.int64(100).item()
      

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        相关资源
        最近更新 更多