pyodbc连接Amazon RDS PostgreSQL执行SQL报语法错误如何解决
问题背景
- 已完成pyodbc与Amazon RDS PostgreSQL的连接配置,安装了psqlodbc(对应PostgreSQL Unicode(x64) ODBC驱动),连接建立环节无异常
- 运行环境为Python 3.7
- 环境限制:公司禁用pip安装权限,无法升级现有软件包,仅可使用指定范围内的已安装包(包含pyodbc)
- 故障表现:执行SQL查询时返回语法错误,自查SQL语句本身不存在语法问题
测试代码如下:
import pyodbc mypw = 'skjhaf234234dkjhkjx' string = 'Driver={PostgreSQL Unicode(x64)};Server=myfakeserveraddress.rds.amazonaws.com;Database=mydb;UID=myusername;PWD='+mypw+';' connection = pyodbc.connect(string) c = connection.cursor() c.execute("SELECT * FROM schema_table.test_table;")
报错详情
- 执行上述初始代码时返回错误:
pyodbc.ProgrammingError: ('42601', '[42601] ERROR: syntax error at or near "'schema_table.test_table'";\nError while executing the query (1) (SQLExecDirectW)')
- 调整语句移除表名周围的引号、去掉末尾分号,执行
c.execute("SELECT * from schema_table.test_table")时返回错误:
pyodbc.ProgrammingError: ('25P02', '[25P02] ERROR: current transaction is aborted, commands ignored until end of transaction block;\nError while executing the query (1) (SQLExecDirectW)')
解决步骤
两个报错分别对应不同原因,按以下操作即可修复:
- 修复42601语法错误:在ODBC连接字符串中添加
QuotedId=0参数,关闭psqlodbc驱动默认的标识符自动加引号逻辑——该逻辑会错误地将传入的模式名.表名整体作为字符串加单引号包裹,导致PostgreSQL无法识别为合法表标识符。 - 修复25P02事务中止错误:PostgreSQL中当一个事务内某条语句执行失败后,整个事务会进入中止状态,必须先执行回滚操作才能运行后续语句。第一次报错后没有回滚事务,直接执行新语句就会触发该错误。可以在连接时设置
autocommit=True自动提交单条语句,避免事务持续挂起;如果需要手动控制事务,每次执行语句捕获到错误后必须先调用connection.rollback()再执行后续操作。
修正后的可运行代码如下:
import pyodbc mypw = 'skjhaf234234dkjhkjx' # 连接字符串新增QuotedId=0参数,连接时开启autocommit conn_str = 'Driver={PostgreSQL Unicode(x64)};Server=myfakeserveraddress.rds.amazonaws.com;Database=mydb;UID=myusername;PWD='+mypw+';QuotedId=0;' connection = pyodbc.connect(conn_str, autocommit=True) c = connection.cursor() c.execute("SELECT * FROM schema_table.test_table") # 后续可正常获取查询结果 res = c.fetchall()
注意:如果需要保留手动事务控制,不需要开启autocommit,只要在每次执行报错后执行connection.rollback()清空失败事务状态即可。
内容的提问来源于stack exchange,提问作者iamyolanda
相关产品推荐
相关产品推荐

