Pandas DataFrame to_sql存入SQLite遇Decimal类型错误,求存为text方案
解决Pandas to_sql无法存储Decimal类型到SQLite的问题
确实,SQLite本身没有原生的Decimal类型支持,Pandas默认的to_sql方法没法直接把Decimal数据绑定到SQLite参数里,就会出现你遇到的sqlite3.InterfaceError错误。针对你想把Decimal以text格式存储的需求,这里有几个实用的解决方案:
方法1:提前将Decimal列转换为字符串
最直接的方式就是把DataFrame里的Decimal列转换成字符串类型,再存入数据库。这样SQLite会自动以text类型存储这些值:
import sqlite3 import pandas as pd import decimal con = sqlite3.connect("test.db") df = pd.DataFrame({"a":[decimal.Decimal(0)]}) # 将Decimal列转为字符串 df["a"] = df["a"].astype(str) df.to_sql(name="table", con=con, if_exists="replace")
这种方法简单直观,不需要额外依赖,适合快速解决问题。
方法2:使用SQLAlchemy指定列类型
如果你习惯用SQLAlchemy来管理数据库连接,可以通过dtype参数明确指定列的存储类型为字符串,Pandas会自动处理Decimal到字符串的转换:
首先需要安装SQLAlchemy(如果没装的话):
pip install sqlalchemy
然后修改代码:
from sqlalchemy import create_engine, String import pandas as pd import decimal # 用SQLAlchemy创建连接 engine = create_engine("sqlite:///test.db") df = pd.DataFrame({"a":[decimal.Decimal(0)]}) # 指定列a的存储类型为String df.to_sql( name="table", con=engine, if_exists="replace", dtype={"a": String} )
这种方式更规范,适合复杂的数据库操作场景,而且不需要修改原始DataFrame的数据。
方法3:注册SQLite的Decimal适配器
你可以给sqlite3注册一个适配器,让它自动把Decimal类型转换为字符串,这样不需要修改DataFrame就能直接存储:
import sqlite3 import pandas as pd import decimal # 注册Decimal到字符串的适配器 sqlite3.register_adapter(decimal.Decimal, str) con = sqlite3.connect("test.db") df = pd.DataFrame({"a":[decimal.Decimal(0)]}) df.to_sql(name="table", con=con, if_exists="replace")
这个方法的好处是全局生效,后续所有的Decimal类型数据都会自动转成字符串存入SQLite,但如果有其他地方需要以数值类型存储Decimal的话,可能需要注意冲突。
以上三种方法都能满足你把Decimal以text格式存入SQLite的需求,你可以根据自己的场景选择最合适的一种。
内容的提问来源于stack exchange,提问作者GlaceCelery
相关产品推荐
相关产品推荐

