将可变数量的args从Python传递给mysql

时间:2014-09-25 14:46:44

标签: python mysql

我想用可变数量的参数构建一个查询:

group_ids = ', '.join(str(Rules[s].value) for s in groups)
cursor.execute("SELECT a, b, c
    FROM my_table
    WHERE a IN (%(group_ids)s)
    ;",
    {'group_ids': group_ids})

但是这会导致警告(默认情况下不会显示!): 截断不正确的DOUBLE值:' 30,12' 并且只使用第一个值,其余的省略。 所以我现在正在使用这个小黑客:

group_ids = ', '.join(str(Rules[s].value) for s in groups)
cursor.execute('\n'.join("SELECT a, b, c",
    "FROM my_table",
    "WHERE a IN %s" % group_ids
    ;")

我知道这些是有效值(来自枚举)但我甚至可以摆脱SQL注入的最低可能性。

1 个答案:

答案 0 :(得分:2)

动态构造SQL的参数部分:

group_ids = [str(Rules[s].value) for s in groups]
sql = "SELECT a, b, c FROM my_table WHERE a IN (%s)" % (
    ','.join(['%s'] * len(group_ids))
)
cursor.execute(sql, group_ids)

注意:上面的内容不适用于空ID列表。保护它的条件是:

if not group_ids:
    # skip execution of the query.