【问题标题】:Datetime with postgresql, python, and a stored procedure带有 postgresql、python 和存储过程的日期时间
【发布时间】:2015-02-21 15:23:15
【问题描述】:

我有一个包含这一行的存储过程:

EXECUTE FORMAT('SELECT * FROM stores.paint WHERE created >= %s... 其中 %s 由参数填充:dt TIMESTAMP

我从 python 控制台调用它:

conn = psycopg2.connect(host=host, database=db, user=user, password=pass) r = conn.cursor() r.callproc('procedure_name', [datetime.datetime.now()])

由于日期时间/时间戳中的空格,我收到错误:

psycopg2.ProgrammingError: syntax error at or near "15" LINE 1: ...* FROM stores.paint WHERE created >= 2015-02-21 15:20:40.2... ^

我尝试在存储过程中使用单引号。这导致它在查询字符串中使用文字 %s

那么,如何将参数传递给其中有空格的存储过程,以便查询真正起作用?

【问题讨论】:

    标签: python postgresql stored-procedures psycopg2


    【解决方案1】:

    在 PostgreSQL format() 函数中使用 %L 而不是 %s 作为占位符。阅读文档。

    EXECUTE FORMAT('SELECT * FROM stores.paint WHERE created >= %L', dt);
    

    最好不要在format() 中填写占位符值,而是使用EXECUTE ... USING

    EXECUTE 'SELECT * FROM stores.paint WHERE created >= $1' USING dt;
    

    【讨论】:

    • 第二个例子(参数化查询)是更好的选择,+1
    【解决方案2】:

    用单引号转义字符串以使其成为正确的 SQL:

    FORMAT('... created >= ''%s'' ...')
    

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      相关资源
      最近更新 更多