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' 正しく合格できるかです。通常、データベースで選択または挿入するときは、2つの変数しか使用しませんが、2つ以上でそれを行う方法がわかりません。

ありがとう。

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 に答える