我的知识记录

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

Python pandas读写SQLite数据库教程

标签:

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

上一篇:Python pandas字符串处理分列替换教程

下一篇:Python pandas读取CSV教程:一行加载成DataFrame