如何使用psycopg2构建动态列名实现按年份查询对应字段?
动态拼接列名查询解决方案
%(yr)s 属于值参数绑定语法,psycopg2会自动对传入的字符串值做转义、加单引号处理,这套语法只能用来传递查询值,不能用来拼接表名、列名这类SQL标识符,这是你之前写法报错的核心原因。
正确实现方式
使用psycopg2内置的sql模块完成标识符拼接即可,示例代码如下:
# 先导入sql模块 from psycopg2 import sql # 你的年份变量 yr = "19" # 构造动态SQL query = sql.SQL("SELECT {} FROM some_table").format( sql.Identifier(f"products{yr}") ) # 执行查询,直接传入构造好的query对象即可,不需要额外传参 cursor.execute(query)
上述写法生成的最终SQL就是符合要求的SELECT products19 FROM some_table,不会额外添加单引号。
安全建议
拼接列名前建议对年份变量做白名单校验,比如仅允许传入预设的合法年份后缀,进一步避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Stonetip
相关产品推荐
相关产品推荐

