1

template_list配列内の値に対して単一の挿入クエリを作成しようとしました。これらの値はフィールド用template_nameです。

dir_template_list = ['template1', 'template2', 'template3']
sql = "INSERT INTO tbltemplate (template_name) VALUES(%s)" % (dir_template_list)

文字列プレースホルダーを使用してこのクエリを作成する簡単で簡単な方法はありますか?

INSERT INTO tbltemplate (template_name) VALUES ('template1'),('template2'),('template3')

編集:これは私の実際のテーブル構造です

FIELD   
-------
id             int(6)         
template_name  VARCHAR(128) 
4

4 に答える 4

5

まず第一に、クエリを作成するために文字列の書式設定を使用しないでください。そうしないと、SQL インジェクションの脆弱性を危険にさらしたり、エスケープに対処したりする必要があります。

適切な方法は、すべての行に対して単一のクエリを使用し、データをパラメーターとして渡すことです。

sql = "INSERT INTO tbltemplate (template_name) VALUES (%s)"
for template in dir_template_list:
    conn.query(sql, (template,))

パフォーマンスを向上させるために、トランザクション内で、または準備済みステートメントを使用してこれを行うことができます。

于 2012-07-02T12:29:15.413 に答える
2

ThiefMaster が指摘しているように、ユーザーからの入力を使用して、文字列の書式設定を使用して SQL クエリを作成しないでください。これは SQL インジェクションの脆弱性であり、今日のソフトウェア システムにおける最大のセキュリティ問題です。

データベースには、安全なクエリ文字列とデータを別々に提供する方法が用意されているため、それを使用する必要があります。

dir_template_list = ['template1', 'template2', 'template3']
sql = "INSERT INTO tbltemplate (template_name) VALUES(?, ?, ?)"
conn.execute(sql, *dir_template_list)

注: データベース接続が何と呼ばれているかはわかりませんが、conn一般的です。また、異なるデータベースはプレースホルダーに異なる構文を使用します: ?%s両方の可能性があります。

于 2012-07-02T12:48:53.213 に答える
1

3 列の 1 行の場合、コードは次のようになります (テーブルが存在する場合)。

import sqlite3
dir_template_list = ['template1', 'template2', 'template3']
con = sqlite3.connect(":memory:")
sql = "INSERT INTO tbltemplate (template_name) VALUES(?, ?, ?)"
con.execute(sql, dir_template_list)
于 2012-07-02T12:51:38.283 に答える
0

さて、私の答えは次のとおりです。

from itertools import repeat
valqs = ','.join(repeat('%s', len(dir_template_list)))
sql = "INSERT INTO tbltemplate (template_name) VALUES(%s)" % valqs

次に、カーソル/接続オブジェクトで execute(sql, dir_template_list) を実行します。

于 2012-07-02T12:56:36.900 に答える