Python pandas读写SQLite数据库教程
用pandas的read_sql、to_sql一行代码把DataFrame写入SQLite,再用read_sql_query把表读回DataFrame,告别手写SQL游标循环。
场景痛点
用sqlite3原生API写数据,要自己拼INSERT语句、自己处理占位符、自己把列表转成元组,几百行字段就很痛苦。pandas把DataFrame直接当数据库表用,to_sql 一把写入,read_sql_query 一把读回,清洗完的数据直接落库,效率高一个量级。
用到的库
pip install pandas
sqlite3是Python标准库,pandas依赖它,不用单独装。
完整代码
import sqlite3
import pandas as pd
from pathlib import Path
DB_PATH = Path("sales.db")
def build_sample_df():
"""构造一份销售数据"""
data = {
"order_id": ["A001", "A002", "A003", "A004", "A005"],
"product": ["笔记本", "鼠标", "键盘", "笔记本", "鼠标"],
"region": ["华北", "华东", "华南", "华北", "华南"],
"amount": [5999, 199, 499, 6299, 219],
"qty": [1, 3, 2, 1, 2],
}
return pd.DataFrame(data)
def write_to_sqlite(df: pd.DataFrame):
"""把DataFrame写入SQLite"""
conn = sqlite3.connect(DB_PATH)
# if_exists="replace" 表存在就重建;"append" 追加;"fail" 报错
df.to_sql("orders", conn, if_exists="replace", index=False)
conn.close()
print("写入SQLite完成")
def read_from_sqlite():
"""从SQLite读回DataFrame"""
conn = sqlite3.connect(DB_PATH)
print("--- read_sql_query 条件查询 ---")
sql = "SELECT product, SUM(amount) AS total FROM orders GROUP BY product"
df = pd.read_sql_query(sql, conn)
print(df)
print("--- read_sql 直接读整张表 ---")
df_all = pd.read_sql("orders", conn)
print(df_all.head())
print("--- 带WHERE的参数化查询 ---")
df_filter = pd.read_sql_query(
"SELECT * FROM orders WHERE region = ?",
conn,
params=("华北",),
)
print(df_filter)
conn.close()
if __name__ == "__main__":
df = build_sample_df()
write_to_sqlite(df)
read_from_sqlite()
代码讲解
df.to_sql("表名", conn, if_exists="replace", index=False):把DataFrame整表写入。index=False避免把pandas的行号写成一列。if_exists三个取值:fail(默认,表已存在就报错)、replace(先DROP再建)、append(追加数据)。做每日增量报表用append最稳。pd.read_sql_query(sql, conn)执行SQL语句返回DataFrame,SQL里用?占位,参数通过params传入,和sqlite3用法一致。pd.read_sql("orders", conn)直接读整张表,等价于SELECT * FROM orders,适合快速预览。
运行结果
脚本同目录生成 sales.db,控制台依次打印按产品汇总的金额、全表前5行、华北区域订单。用DB Browser打开可看到 orders 表结构和数据。
注意事项
to_sql第一次写入会自动建表,字段类型按DataFrame推断;后续追加时列顺序要对齐,否则报 OperationalError。- 大数据量写入用
method="multi"可以一次插入多行,速度比默认快几倍:df.to_sql("orders", conn, method="multi")。 - 写入前最好
df = df.dropna(how="all")清掉全空行,避免脏数据进库。 - SQLite对日期类型支持弱,pandas写入后时间列会变成TEXT,读出来要自己
pd.to_datetime。

更新时间:2026-09-14 20:56:33