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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:31