numpy和SQL数据类型之间的兼容性

时间:2016-01-30 20:17:14

标签: python-2.7 numpy sqlite

我正在尝试将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数据类型之间的兼容性。

1 个答案:

答案 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)