使用SQLAlchemy+pandas创建MySQL表未插入数据,求排查错误
排查与解决步骤
先从最常见的问题开始逐一排查:
1. 确认CSV是否被正确读取
很多时候表创建了但没数据,根源是pandas根本没读到CSV里的内容。在df = pd.read_csv(...)之后添加以下代码验证:
print(df.shape) # 输出(行数, 列数),如果行数为0就是没读到数据 print(df.head()) # 打印前5行数据,直观确认内容
如果没读到数据:
- 检查文件路径:用
import os; print(os.getcwd())查看脚本当前工作目录,确认./data/artist.csv的相对路径是否正确,或者直接改用绝对路径(比如C:/project/data/artist.csv或/home/user/project/data/artist.csv)。 - 检查文件编码:CSV文件可能用了非utf-8编码,尝试指定编码读取:
df = pd.read_csv("./data/artist.csv", encoding="gbk") # 中文文件常用gbk编码 # 或者尝试encoding="utf-8-sig"处理带BOM的utf-8文件
2. 调整数据库连接方式
你当前用engine.connect()返回的connection对象,有时会因为事务未提交导致数据没写入。可以试试两种调整方式:
- 直接用engine对象作为
con参数:df.to_sql("artist", con=engine, index=False, if_exists="replace") - 用事务上下文管理器确保自动提交:
with engine.begin() as connection: df.to_sql("artist", con=connection, index=False, if_exists="replace")
3. 捕获具体错误信息
如果以上步骤都没问题,添加异常捕获代码,查看真实报错原因:
import pandas as pd from sqlalchemy import create_engine engine = create_engine("mysql://root:1234@localhost:3306/paintings") try: df = pd.read_csv("./data/artist.csv") print(f"读取到{len(df)}条数据") with engine.begin() as connection: df.to_sql("artist", con=connection, index=False, if_exists="replace") print("数据插入成功") except Exception as e: print(f"出错详情: {str(e)}")
常见的报错可能是数据类型不兼容(比如CSV里的字符串长度超过MySQL默认的varchar限制)、字段名包含MySQL保留字等,根据报错信息针对性调整即可。
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

