Python/Pandas整数存入SQLite变为BLOB类型的问题求助
解决SQLite中存入int64变为BLOB的问题
这个问题我之前也踩过类似的坑,根源在于Python的sqlite3模块默认会把numpy的数值类型(比如int64)当成二进制BLOB存储,而非自动转换成SQLite能识别的INTEGER类型。哪怕你用astype(int)转换pandas列,pandas里的int本质还是numpy的int64,直接取values[0]拿到的依然是numpy对象,插入时自然会被存成BLOB。
给你几个实用的解决思路:
1. 插入时转为Python原生int类型
不要直接用numpy的values[0],而是把数值转换成Python原生的int类型,两种简单方式:
# 方法1:用item()获取原生Python int baujahr_val = Objekt.Baujahr.iloc[0].item() # 方法2:直接强转 baujahr_val = int(Objekt.Baujahr.values[0]) # 再执行插入语句 stmt ="INSERT INTO Objekt (Objekt_id, Strecke, Baujahr, Eigentümer) VALUES (?, ?, ?, ?)" c.execute(stmt, (Objekt.Objekt_id.values[0], Objekt.Strecke.values[0], baujahr_val, Objekt.Eigentümer.values[0] )) conn.commit()
2. 用pandas的to_sql替代手动INSERT
手动写INSERT很容易踩类型映射的坑,pandas的to_sql方法会自动处理SQLite的类型适配,省心很多:
# if_exists='append'表示追加数据,可根据需求调整为replace/fail Objekt.to_sql('Objekt', conn, if_exists='append', index=False)
这样pandas会自动把int64列映射到SQLite的INTEGER类型,不会出现BLOB的问题。
3. 注册numpy类型的适配器(适合批量插入场景)
如果必须用手动执行SQL的方式,可以给sqlite3注册一个适配器,让它自动把numpy的int64转换成Python int:
import sqlite3 import numpy as np # 定义适配器函数 def adapt_numpy_int64(val): return int(val) # 注册适配器 sqlite3.register_adapter(np.int64, adapt_numpy_int64) # 之后再执行你的INSERT语句就正常了 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()
补充说明
你之前尝试的Objekt.Baujahr.astype(int)其实没解决本质问题——因为pandas的int dtype底层还是numpy的int64,取出来的数值依然是numpy对象,必须转成Python原生int才能被sqlite3正确识别为INTEGER类型。
内容的提问来源于stack exchange,提问作者Stivi B
相关产品推荐
相关产品推荐

