使用Psycopg执行INSERT操作时能否传入PostgreSQL内置函数
结论先行
Psycopg的参数占位符%s只能传入Python类型的字面量值,不支持通过占位符传入PostgreSQL内置函数,也不需要为了使用PG函数把所有值都硬编码,可以混合使用内置函数和参数占位符。
具体说明
- 占位符传参的本质是值传递:Psycopg会自动对所有传入的参数做类型转义、引号包裹处理,所有参数都会被当做纯字面量插入数据库,不会被识别为SQL逻辑执行。
如果你尝试把NOW()作为字符串通过占位符传入,最终存入数据库的会是字符串'NOW()',而非执行NOW()得到的时间结果,如果对应字段是时间类型甚至会直接触发类型不匹配报错,错误写法示例:# 错误示例,无法实现调用NOW()的效果 cur.execute(""" INSERT INTO some_table (an_int, a_date, a_string) VALUES (%s, %s, %s); """, (10, "NOW()", "O'Reilly")) - 支持内置函数和占位符混合使用:不需要为了用PG内置函数就把所有值硬编码,你可以直接把需要调用的PG函数写在SQL语句的对应位置,动态值的部分保留占位符即可,既可以用到PG的内置能力,也能保留参数化查询防SQL注入的优势,正确写法示例:
# 正确示例:混合使用PG内置函数和参数占位符 cur.execute(""" INSERT INTO some_table (an_int, a_date, a_string) VALUES (%s, NOW(), %s); """, (10, "O'Reilly"))
内容的提问来源于stack exchange,提问作者gbox
相关产品推荐
相关产品推荐

