You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:58:27