使用%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
相关产品推荐
相关产品推荐

