使用SQLAlchemy执行SQL文件插入数据时出现ProgrammingError报错
问题原因
SQLAlchemy的execute(text())默认仅支持执行单条SQL语句,你把CREATE TABLE和INSERT INTO两条语句合并成一个字符串提交,导致数据库解析时出现语法错误。
解决方案
提供两种可行的解决方式,按需选择:
方式1:拆分SQL语句,逐条执行
读取.sql文件内容后,按分号;拆分语句,过滤掉空内容后逐条执行:
# 替换原来的SQL读取和执行部分 with open(file, 'r') as f: sql_content = f.read() # 按分号拆分语句,过滤空行和空白字符 sql_statements = [stmt.strip() for stmt in sql_content.split(';') if stmt.strip()] conn, engine = connect_to_sql_server_for_tbl(db_name_to_create) for stmt in sql_statements: conn.execute(text(stmt)) conn.commit() # 务必提交事务,否则数据不会写入数据库 conn.close()
进阶优化:如果你的SQL语句中存在包含分号的字符串(比如字段值里的';'),简单拆分会出错,此时用专业SQL解析库sqlparse处理更安全:
先安装依赖:pip install sqlparse
再修改拆分逻辑:
import sqlparse with open(file, 'r') as f: sql_content = f.read() # 使用sqlparse安全拆分SQL语句 sql_statements = [str(stmt).strip() for stmt in sqlparse.parse(sql_content) if str(stmt).strip()] # 后续执行逻辑同上
方式2:开启多语句执行模式
修改数据库连接配置,开启pymysql的多语句支持,这样可以一次性执行多条SQL语句:
首先导入必要的模块:
import pymysql from pymysql.constants import CLIENT
然后在创建engine时添加connect_args参数(修改connect_to_sql_server_for_tbl函数中的engine创建逻辑):
engine = create_engine( f"mysql+pymysql://{username}:{password}@{host}:{port}/{db_name_to_create}", connect_args={"client_flag": CLIENT.MULTI_STATEMENTS} )
之后就可以像之前一样直接执行合并后的SQL语句,但注意:这种方式存在SQL注入风险,仅在执行可信的.sql文件时使用。
额外注意事项
- 执行数据写入操作后必须调用
conn.commit(),否则数据不会持久化到数据库(你原代码缺少这一步)。 - 尽量用
with语句管理文件和数据库连接,避免资源泄漏。
内容的提问来源于stack exchange,提问作者ujjwal anand
相关产品推荐
相关产品推荐

