0

我试图在我的 python 脚本中传递一个 sql (如果我在客户端上运行它,它可以完美地工作),但我收到错误“格式字符串的参数不足”

接下来,代码:

sql = """
SELECT
  rr.iserver,
    foo.*, rr.queue_capacity,
    rr.queue_refill_level,
    rr.is_concurrent,
    rr.max_execution_threads,
    rr.retrieval_status,
    rr.processing_status
FROM
    (
        SELECT DISTINCT
            ip.package,
            it. TRIGGER
        FROM
            wip.info_package ip,
            wip.info_trigger it
        WHERE
            ip.service = it.service and
      ip.iserver = '%(iserver)s' and
      it.iserver = %(iserver)s'
        AND package = '%(package)s'
        UNION
            SELECT
                '%(package)s' AS package,
                TRIGGER
            FROM
                info_trigger
            WHERE
                TRIGGER LIKE '%(package)s%'
    ) AS foo,
    info_trigger rr
WHERE
    rr. TRIGGER = foo. TRIGGER
""" % {'iserver' : var_iserver,'package' : var_package}
dcon = Database_connection()
getResults = dcon.db_call(sql, dbHost, dbName, dbUser, dbPass)
# more and more code to work the result....

我的主要问题是如何'%(iserver)s' , '%(package)s' 正确通过。因为通常,当我在数据库上选择或插入时,我只使用两个变量,但我不知道如何使用两个以上的变量。

谢谢。

4

2 回答 2

9

不要使用以下方式构建 SQL %

"SELECT %(foo)s FROM bar WHERE %(baz)s" %
  {"foo": "FOO", "baz": "1=1;-- DROP TABLE bar;"}

这为讨厌的 SQL 注入攻击打开了大门。

使用正确形式的Python 数据库 API 规范 v2.0适配器。对于 Psychopg,此表格在此处进行了描述。

cur.execute("SELECT %(foo)s FROM bar WHERE %(baz)s",
  {"foo": "FOO", "baz": "1=1;-- DROP TABLE bar;"})
于 2012-10-17T16:24:38.520 回答
8
WHERE
                TRIGGER LIKE '%(package)s%'

你有一个额外的“%”

如果你想要实际的字符 '%',你需要用一个双 '%' 转义。

所以应该是

WHERE
                TRIGGER LIKE '%(package)s%%'

如果你想显示一个 '%'

WHERE
                TRIGGER LIKE '%(package)s'

如果你不

于 2012-10-17T16:21:08.027 回答