通过参数

时间:2015-08-21 10:03:05

标签: python postgresql psycopg2

我想在查询中通过参数指定排序方向(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

但我不喜欢这个想法,因为将来我可能会有更多的条件...

1 个答案:

答案 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注入攻击。