2011-11-29 8 views
6

データベースにリストを挿入したいができない。ここでリストをデータベースにPythonを使って挿入する

は私が必要なものの一例である:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
list = [variable_1,variable_2] 

INSERT INTO table VALUES ('%s') % list 

はこのような何かを行うことができますか?値としてリストを挿入することはできますか? 私はそれを試してみると、それはエラーがMySQLの構文のエラーのためだと言います

+2

エラーメッセージを持っている場合、あなたは質問にそれを含める必要があります。 –

+0

なぜredisを使用しないのですか?astとredis-pyモジュールを使用している場合、あなたはredis.eg.r.set(a、[1,2,3,3])にリストを書くことができます。 = ast.literal_eval(r.get(a))リストを取得する –

答えて

12

あなたの元の質問への答えは:いいえ、そのようなリストを挿入することはできません。

しかし、いくつかの調整で、あなたは%rを使用してタプルを渡すことによって、そのコードの作品を​​作ることができる:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
varlist = [variable_1, variable_2] 
print "INSERT INTO table VALUES %r;" % (tuple(varlist),) 

残念ながら、変数の挿入のそのスタイルはSQL injection attacksに対して脆弱あなたのコードを残します。

代わりに、我々はPython's DB APIを使用して、データを挿入するための複数の疑問符を持つカスタマイズされたクエリ文字列を構築するお勧めします。

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
varlist = [variable_1,variable_2] 
var_string = ', '.join('?' * len(varlist)) 
query_string = 'INSERT INTO table VALUES (%s);' % var_string 
cursor.execute(query_string, varlist) 

例をSQLite3 docsの先頭には、質問を使用して引数を渡す方法を示していますなぜそれらが必要なのかを説明しています(基本的に、変数の正確な引用を保証しています)。

4

あなたの質問は不明です。

リストをカンマ区切りのテキスト文字列としてデータベースの単一の列に挿入しますか?または、各要素を別の列に挿入したいですか?どちらも可能ですが、技術は異なります。 1列に

挿入カンマ区切りのリスト:

conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)]) 

別々の列に挿入します。

params = ['?' for item in list] 
    sql = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params) 
    conn.execute(sql, list) 

は、両方のあなたは、接続名CONNを確立していると仮定。

いくつかの他の提案:

  • はあなたに挿入している名前と列の順序をリストしていないINSERT文を避けるようにしてください。そのような発言は非常に壊れやすいコードにつながります。テーブル内の列を追加、削除、または移動するとブレークします。

  • 単一フィールドにコンマ区切りのリストを挿入すると、データベースデザインのプリンシパルに一般に違反するため、別のテーブルをレコードごとに1つ使用する必要があります。

  • 別のフィールドに挿入している場合は、Word1Word2のような名前があります。これは、代わりに別のテーブルを使用する必要があることを示しています。

  • SQL文の作成に直接文字列置換を使用しないでください。値の1つがたとえばo'clockの場合は破損します。また、SQLインジェクション技術を使用している人の攻撃も可能にします。

+0

HI Larry .... 同じ列に2つの異なる文字列を挿入したいのですが...。その列は...私は2つの異なる文字列があることを知っています.....そのため、リストとして値を挿入しようとしています。 – mauguerra

+1

あなたはそれを行うことはできません。列には1つの文字列しか格納できません。その文字列にコンマを入れて2つの異なる文字列のようにすることはできますが、文字列*の1つにカンマがある場合は、それはうまくいきません。しかし、データベースの正規化の考え方を見直し、データベースを再設計して、関連する別の表を使用してこれらの値を保持する必要があります。データベースの列に複数の値を入力することは決してありません。 –

1

あなたはJSONにリストを変換し、DBへのJSONを書くためにjson.dumpsを使用することができます。例えば

:一般的に

insert table example_table(column_name) values(json.dumps(your_list)) 
+0

この例は非常に混乱しています。あなたのSQL文字列の中から 'json.dumps'のようなPython関数を使うことはできません。最初に 'json.dumps'を呼び出してから、他の回答で提案されているパラメータ置換メソッドの1つを使用して、結果のJSON文字列をパラメータとして渡す必要があります。 JSON文字列をデータベースの列に格納することは、通常はあまりお勧めできません。 – tsleyson

関連する問題