我想在查询中通过参数指定排序方向(ASC / DESC),但psycopg2抛出错误,因为我发送字符串作为保留字的替代:
ProgrammingError: syntax error at or near "'ASC'"
这是我的代码:
cursor.execute("""
SELECT * FROM foo
ORDER BY
CASE %(order_by)s
WHEN 'a' THEN textfield_a %(sort_direction)s
WHEN 'b' THEN textfield_b %(sort_direction)s
ELSE 'c' THEN textfield_c
END""", dict(order_by='a', sort_direction='ASC'))
psycopg2中有没有办法做到这一点?
当然,可能的解决方案是连接两个参数并复制条件,如:
ORDER BY
CASE %(order_by_concatenation)s
WHEN 'a:ASC' THEN textfield_a ASC
WHEN 'a:DESC' THEN textfield_a DESC
WHEN 'b:ASC' THEN textfield_b ASC
WHEN 'b:DESC' THEN textfield_b DESC
ELSE 'c' THEN textfield_c
END
但我不喜欢这个想法,因为将来我可能会有更多的条件...
答案 0 :(得分:1)
您需要使用字符串插值。参数替换仅适用于文字。不幸。 - 克雷格林格
cursor.execute("""
SELECT * FROM foo
ORDER BY
CASE %(order_by)s
WHEN 'a' THEN textfield_a {0}
WHEN 'b' THEN textfield_b {0}
ELSE 'c' THEN textfield_c
END""".format('ASC'), dict(order_by='a'))
您需要非常小心您的排序顺序变量,因为它可能会受到SQL注入攻击。