【问题标题】:Compatibility between numpy and SQL data typesnumpy 和 SQL 数据类型之间的兼容性
【发布时间】:2016-01-30 20:17:14
【问题描述】:

我正在尝试将 astropy.fits FITS_rec 数组(非常类似于 numpy recarray)写入 SQLite3 数据库。这个想法是自动识别数组中各个字段的数据类型并相应地创建数据库表。通过遍历列可以正常工作:

for key_idx, key in enumerate(self.data.names):
    print type(self.data[key][0]) 
    if type(self.data[key][0]) == numpy.float32:
        table_cmd += "'%s' FLOAT" % key
    if type(self.data[key][0]) == numpy.float64:
        table_cmd += "'%s' DOUBLE" % key
    if type(self.data[key][0]) == numpy.int16:
        table_cmd += "'%s' INTEGER" % key 
    if type(self.data[key][0]) == numpy.int32:
        table_cmd += "'%s' INTEGER" % key 
    if type(self.data[key][0]) == numpy.string_:
        table_cmd += "'%s' TEXT" % key 
    if key_idx < self.shape[1]-1:
        table_cmd += ", "
table_cmd += ")"
print table_cmd

创建:

创建表数据('FLUX_ISOCOR' FLOAT,'FLUXERR_ISOCOR' FLOAT, ..., 'FLAGS' INTEGER, 'FLUX_GROWTH' FLOAT, 'FLUX_GROWTHSTEP' FLOAT, 'FLUX_RADIUS' FLOAT)

如果我尝试将值插入数据库

db.executemany("INSERT INTO data VALUES (" + \
               ','.join(['?' for i in range(self.shape[1])]) + \
               ')', data)

我不断收到以下错误消息:

sqlite3.InterfaceError:错误绑定参数 0 - 可能 不支持的类型。

我发现这是因为我尝试插入表中的数据类型是 numpy 数据类型(numpy.float32、numpy.float64、numpy.int16...),它们可能与 SQL 数据不兼容类型 (FLOAT, INT, ...) 我在表定义中使用。我的问题是我应该为不同的 numpy 数据类型使用哪些 SQL 数据类型,例如,我可以将 numpy.float32(64?)插入 SQL FLOAT(DOUBLE?)表字段吗?

我尝试将所有数据更改为简单的浮点数,然后将它们插入表中 - 这可行,但需要很长时间,因为我必须遍历所有数据。这让我觉得问题出在 numpy 和 SQL 数据类型的兼容性上。

【问题讨论】:

  • 你试过 odo 库吗?它可以将 numpy.recarray 转换为 sqllite。 odo.pydata.org/en/latest/sql.html
  • 谢谢,我以前没有听说过 odo。我会试一试,虽然我更喜欢不需要添加额外模块的解决方案。
  • 我想我想通了:在我的 64 位系统上,SQLite3 接受 64 位数据类型,即分别对应 FLOAT/REAL 和 INTEGER 的 numpy.float64 和 numpy.int64。
  • 如果你弄明白了,请务必添加答案。

标签: python-2.7 numpy sqlite


【解决方案1】:

SQLite 支持一组有限的数据类型。要使用 numpy Python 数据类型,您可以使用 register_adapter 函数将类型转换为 SQLite 支持的表示形式。

import numpy as np
import sqlite3

sqlite3.register_adapter(np.float64, float)
sqlite3.register_adapter(np.float32, float)
sqlite3.register_adapter(np.int64, int)
sqlite3.register_adapter(np.int32, int)    

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2011-10-26
    • 2011-09-01
    • 2020-02-10
    • 1970-01-01
    • 2019-11-16
    • 2016-09-03
    • 2018-05-05
    • 2012-07-03
    相关资源
    最近更新 更多