pandas.read_sql()是读取MySQL数据的首选方法,需先创建SQLAlchemy引擎,支持参数化查询防注入;read_sql_table()仅适用于无条件全表读取;大数据量应分块处理,优先SQL层聚合。
用 pandas.read_sql() 读取 MySQL 数据最直接
绝大多数情况下,pandas.read_sql() 是首选。它底层调用 SQLAlchemy,兼容性好、语法简洁,且能自动推断列类型(如 DATETIME → datetime64[ns])。
关键前提是先建好 SQLAlchemy 引擎:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:password@localhost:3306/dbname')
然后读取:
import pandas as pd
df = pd.read_sql("SELECT * FROM users WHERE created_at > '2024-01-01'", engine)
- SQL 语句必须是字符串,不支持参数化查询的占位符(如
%s),要用params=参数传入 - 若 SQL 含变量,推荐用
pd.read_sql("SELECT * FROM t WHERE id = %(id)s", engine, params={'id': 123}) - 避免直接拼接字符串防 SQL 注入,尤其是用户输入参与查询时
read_sql_table() 只适合整表导出,不支持 WHERE 或 JOIN
pd.read_sql_table() 本质是“把整张表当视图读”,不走 SQL 解析,所以不能加条件、不能关联其他表,也不能用函数或别名。它快,但场景极窄。
适用情形只有:确认要全量加载某张小表,且表结构稳定、无敏感字段。
- 必须指定
table_name和con(引擎),不能传 SQL 字符串 - 支持
schema参数读取非默认 schema 的表,例如read_sql_table('logs', engine, schema='prod') - 如果表有自增主键,可配合
chunksize分批读,但注意它不会自动按主键排序,需额外加ORDER BY—— 此时不如直接用read_sql()
MySQL 连接驱动选 pymysql 还是 mysqlclient?
两者都支持,但行为有差异:pymysql 纯 Python 实现,安装简单(pip install pymysql),Windows/macOS 兼容性好;mysqlclient 是 C 扩展,性能略高,但编译依赖多(尤其 macOS 需 Xcode command line tools)。