Pandas read_sql传列、模式、表参数查询PostgreSQL报语法错如何解决
错误原因
SQL参数化查询的占位符?仅支持传入值类型参数,不支持传入列名、库名、表名这类数据库标识符:pyodbc执行时会自动给传入的标识符参数加单引号,最终生成的非法SQL如下:
select count('record_id') from 'c_admin'.'backup_table';
PostgreSQL解析时会把单引号包裹的内容识别为字符串字面量,不符合标识符语法规则,因此抛出42601语法错误。
另外你给出的示例代码还有语法错误:params参数的列表右括号缺失。
解决方法
如果你的column_name、schema_name、table_name三个变量是可控的(非用户直接输入),直接用Python字符串格式化拼接标识符即可,代码如下:
# 注意如果标识符包含大写字母、特殊字符,需要给占位符外层加双引号适配PostgreSQL语法 sql = f'''select count({column_name}) from {schema_name}.{table_name};''' df = pd.read_sql(sql, conn)
如果变量来自用户输入,需要先做合法性校验(比如限制仅允许字母、数字、下划线,长度不超过64位),避免SQL注入风险。
内容的提问来源于stack exchange,提问作者scrollout
相关产品推荐
相关产品推荐

