You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:36:04