使用 postgresql、python 和存储过程的日期时间

Datetime with postgresql, python, and a stored procedure

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

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()])

由于日期时间/时间戳中的 space,我收到错误消息:

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

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

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

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

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

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

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

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

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