在 sqlite 中存储整数会导致 BLOB(二进制值)而不是 SQLite 中的 INTEGER。问题是“Baujahr”列中的 INT。表已创建。
CREATE TABLE "Objekt" ( `No` INTEGER NOT NULL UNIQUE, `Objekt_id` INTEGER,
`Strecke` TEXT, `Baujahr` INTEGER, `Eigentümer` TEXT, PRIMARY KEY(`No`) )
Run Code Online (Sandbox Code Playgroud)
数据框和数据类型:
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
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
Sqlite 仅适用于 INT 8,不适用于 INT 32 或 INT64(CREATE TABLE .... 中的定义 BIGINT 也无济于事)。所以我尝试使用这些转换进行转换
Objekt.Baujahr.astype(int)
Objekt.Baujahr.astype(np.int8)
Objekt.Baujahr = int(Objekt.Baujahr)
Run Code Online (Sandbox Code Playgroud)
dtypes 命令显示 Baujahr 仍然是 int64!!
我无法编辑数据库中的值,通过查询这些值,我得到了一个二进制文件。任何的想法?
Python 3.6.4、sqlite3 2.6.0、熊猫 0.22.0
出于某种原因,Sqlite 不接受大于 8 字节的 INT。因此有必要添加以下语句。
sqlite3.register_adapter(np.int64, lambda val: int(val))
sqlite3.register_adapter(np.int32, lambda val: int(val))
Run Code Online (Sandbox Code Playgroud)
sqlite 中的文档在这一点上有点短。但它完美地工作。
| 归档时间: |
|
| 查看次数: |
1607 次 |
| 最近记录: |