我正在尝试将astropy.fits FITS_rec数组(非常类似于numpy recarray)编写到SQLite3数据库中。我们的想法是自动识别数组中各个字段的数据类型,并相应地创建db表。通过循环遍历列可以正常工作:
db.executemany("INSERT INTO data VALUES (" + \
','.join(['?' for i in range(self.shape[1])]) + \
')', data)
创建:
CREATE TABLE数据('FLUX_ISOCOR'FLOAT,'FLUXERR_ISOCOR'FLOAT, ......,'FLAGS'INTEGER,'FLUX_GROWTH'FLOAT,'FLUX_GROWTHSTEP'FLOAT,'FLUX_RADIUS'FLOAT)
如果我尝试将值插入数据库
{{1}}
我不断收到以下错误消息:
sqlite3.InterfaceError:错误绑定参数0 - 可能 不支持的类型。
我发现这是因为我尝试插入表中的数据类型是numpy数据类型(numpy.float32,numpy.float64,numpy.int16 ...),它们可能与SQL数据不兼容我在表定义中使用的类型(FLOAT,INT,...)。我的问题是我应该为不同的numpy数据类型使用哪些SQL数据类型,例如,我可以将numpy.float32(64?)插入到SQL FLOAT(DOUBLE?)表字段中吗?
我尝试将所有数据更改为简单的浮点数,然后将它们插入表中 - 这可行,但需要很长时间,因为我必须遍历所有数据。这让我觉得问题实际上是numpy和SQL数据类型之间的兼容性。
答案 0 :(得分: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)