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

使用%s参数占位符执行Pymysql联合查询时出现SQL语法错误

排查并修复Pymysql中的SQL联合查询语法错误

我帮你排查出几个导致ProgrammingError的SQL语法问题,咱们一个个解决:

错误点分析

  • 第二个SELECT语句缺失FROM关键字:在第二个查询的SELECT Distinct Pnumber后面直接写了表名PROJECT,漏掉了必须的FROM关键字,数据库无法识别查询来源表。
  • 表名拼写错误:第二个查询里的EMPLOYERE是拼写错误,正确表名应该是EMPLOYEE(多了一个字母r),数据库找不到这个不存在的表。
  • (可选优化)参数传递冗余:两个占位符都使用了相同的Smith值,其实可以简化参数传递,不用定义两个变量。

修正后的完整代码

import pymysql

# 假设你已经完成了数据库连接和游标初始化,比如:
# conn = pymysql.connect(host='your_host', user='your_user', password='your_pwd', db='your_db')
# curs = conn.cursor()

smith = 'Smith' 
# 修复SQL语句中的语法错误
sql="""
SELECT DISTINCT Pnumber 
FROM PROJECT, DEPARTMENT, EMPLOYEE 
WHERE Dnum = Dnumber AND Mgr_ssn=Ssn AND Lname= %s 
UNION 
SELECT DISTINCT Pnumber 
FROM PROJECT, WORKS_ON, EMPLOYEE 
WHERE Pnumber = Pno AND Essn=Ssn AND Lname=%s
""" 
# 执行查询,这里也可以简化成(smith,)因为两个参数值相同
curs.execute(sql, (smith, smith)) 
# conn.commit()  # 注意:SELECT查询不需要commit,只有增删改操作才需要提交事务
rows = curs.fetchall() 
print(rows)

# 记得关闭游标和连接
# curs.close()
# conn.close()

另外补充一个小提醒:SELECT查询不需要调用conn.commit(),commit是用于提交事务(比如INSERT/UPDATE/DELETE操作)的,SELECT操作执行后直接fetch结果即可,这行代码可以注释掉或者删掉。

内容的提问来源于stack exchange,提问作者MinwookJe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:48:48