You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:22:41