python / pandas中的整数在sqlite

时间:2018-03-23 18:23:38

标签: python sqlite

在sqlite中存储一个整数会导致在sqlite中使用BLOB(二进制值)而不是INTEGER。问题在于" Baujahr"柱。该表已创建。

CREATE TABLE "Objekt" ( `No` INTEGER NOT NULL UNIQUE, `Objekt_id` INTEGER, 
`Strecke` TEXT, `Baujahr` INTEGER, `Eigentümer` TEXT, PRIMARY KEY(`No`) )

dataframe和dtypes:

id  Strecke  Baujahr Eigentümer Objekt_id
5     A23     1938    Fronz      0327

Objekt.dtypes
Strecke       object
Baujahr        int64
Eigentümer    object
Objekt_id     object
dtype: object

将DataFrame写入sqlite

stmt ="INSERT INTO Objekt (Objekt_id, Strecke, Baujahr, Eigentümer) VALUES (?, ?, ?, ?)"
c.execute(stmt, (Objekt.Objekt_id.values[0], Objekt.Strecke.values[0], 
Objekt.Baujahr.values[0], Objekt.Eigentümer.values[0] ))
conn.commit()

Sqlite仅适用于INT 8,不适用于INT 32或INT64(CREATE TABLE中的定义BIGINT也无效)。所以我尝试使用这些转换进行转换

Objekt.Baujahr.astype(int)
Objekt.Baujahr.astype(np.int8)
Objekt.Baujahr = int(Objekt.Baujahr)

dtypes命令显示Baujahr仍然是int64 !!

我无法编辑数据库中的值,通过查询这些值,我得到了二进制文件。有什么想法吗?

Python 3.6.4,sqlite3 2.6.0,pandas 0.22.0

1 个答案:

答案 0 :(得分:3)

由于某种原因,Sqlite不接受大于8字节的INT。因此,有必要添加以下语句。

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

sqlite中的文档在这一点上有点短。但它完美无缺。