-1

データベースに挿入したい書式設定された文字列のリストがあります。データベースがこのタイプの文字列を受け入れるように書式設定されています。

フォーマットの例を次に示します。

mylist = [('123456789'), ('987654321'), ('1234554321'),....('9999999999')]
mylist[0] = ('123456789')

正しく入力されるように、形式を維持する必要があります。

SQLインジェクションに対して安全であることを確認したいのですが、

私はこれが機能することを知っています:

database = connection.cursor()
for data in mylist:
    command = " INSERT INTO my_table(my_value) VALUES %s" %data
    database.execute(command)
connection.commit()

ただし、これがSQLインジェクションを防ぐ正しい方法であるかどうかはわかりません

私がやりたいことはありますが、うまくいきません:

database = connection.cursor()
for data in mylist:
    command = " INSERT INTO my_table(my_value) VALUES %s"
    database.execute(command, (data))
connection.commit()

私が受け取るエラーは次のとおりです。

'str' object is not callable

ここでこれが正しいことをオンラインで見たので、なぜ機能しないのですか

4

2 に答える 2

3

タプルを渡す必要があります。

database.execute(command, (data,))

コンマに注意!リストを渡すこともできます:

database.execute(command, [data])

挿入する値のリストがあるため、 を使用cursor.executemany()してデータベースにすべての値を一度に適用させることができますが、リスト内の各要素をタプルまたはリストにする必要があります。

with connection:
    with connection.cursor() as cursor:
        command = "INSERT INTO my_table(my_value) VALUES %s"
        cursor.executemany(command, ((data,) for data in mylist))

接続とカーソルの両方をコンテキスト マネージャーとして使用できることに注意してください。接続のwithブロックが終了すると、代わりにトランザクションがロールバックされる時点で例外が発生しない限り、トランザクションは自動的にコミットされます。コンテキスト マネージャーはcursorカーソルを閉じ、カーソルに関連付けられているリソースを解放します。psycopg2ドキュメントを参照してください。

于 2015-12-07T10:50:31.910 に答える
1

Very hard to understand what you mean. This is my try:

mylist = ['123456789','987654321','1234554321','9999999999']
mylist = [tuple(("('{0}')".format(s),)) for s in mylist]
records_list_template = ','.join(['%s'] * len(mylist))
insert_query = '''
    insert into t (s) values
    {0}
'''.format(records_list_template)
print cursor.mogrify(insert_query, mylist)
cursor.execute(insert_query, mylist)
conn.commit()

Output:

insert into t (s) values
('(''123456789'')'),('(''987654321'')'),('(''1234554321'')'),('(''9999999999'')')

The inserted tuples:

select * from t;
       s        
----------------
 ('123456789')
 ('987654321')
 ('1234554321')
 ('9999999999')
于 2015-12-07T14:25:46.490 に答える