我有一个包含以下行的存储过程:
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
。
那么,我如何将参数传递给其中有空格的存储过程,以便查询实际工作?
答案 0 :(得分:1)
在PostgreSQL %L
函数中使用%s
代替format()
作为占位符。阅读文档。
EXECUTE FORMAT('SELECT * FROM stores.paint WHERE created >= %L', dt);
更好的是,不要在format()
中填充占位符值,而是使用EXECUTE ... USING
EXECUTE 'SELECT * FROM stores.paint WHERE created >= $1' USING dt;
答案 1 :(得分:0)
使用单引号转义字符串以使其成为正确的SQL:
FORMAT('... created >= ''%s'' ...')