2012-01-11 37 views
3

すべての値をsqliteデータベースに追加する辞書があります。ディクショナリ内のすべてのキーはデータベースに存在し、すべてのキーはstring型です。しかし、データベースに値を渡すことに問題があります。次のコードは、それは「その中で文字列に出くわすたび、醜い安全でない、とのエラーですが、それは一種の作品。python dictをSQLite DBに挿入

Query="INSERT INTO packages VALUES(" 
    for tag in Tags: 
     Query=Query + '"' + Package[tag] + '", ' 
    Query=Query[:-2]+")" 
cursor.execute(Query) 

それが安全であるとして入力を受け付けるようにどのように私はエレガントにこの問題を解決することができ"文字列で?私はいくつかの方法を見つけました。たとえば、

fields = Package.keys() 
values = Package.values() 
query = "INSERT INTO packages (%s) VALUES (%%s);" % (",".join(fields)) 
cursor.execute(query, values) 

ですが、タイプエラーが発生します。

TypeError: function takes at most 2 arguments (38 given) 

最もエレガントな解決策は、私が遭遇してきたこれまでの

sql_insert = ('INSERT INTO packages (%s) VALUES (%s)' % 
      (','.join('%s' % name for name in Package), 
      ','.join('%%(%s)s' % name for name in Package))) 
cursor.execute(sql_insert, Package) 

ように見えますが、それはもう一度、私の質問はどのようにすることができますです

sqlite3.OperationalError: near "%": syntax error 

を言って、操作エラーがスローされます私はエレガントに安全に値を辞書からデータベースに追加しますか?

P.S.私はPython 2.5.1を使用していることに注意する価値があります。

答えて

3

Afaikは、クエリに "?"プレースホルダexecute()メソッドは自動的に引数型に基づいて自動的にエスケープします。だから、次のように動作するはずです:私は同じ問題に遭遇してきた

query = 'INSERT INTO packages VALUES(%s)' % ','.join(['?'] * len(Tags)) 
cursor.execute(query, Tags) 
+0

作品を作成しました魔法のように。ありがとうございました! – Trcx

+0

'タグ 'がOPが使用している辞書である場合を除いて、'タグ 'はキー名を渡すだけで、それらは任意の順序になります。 –

+0

残念ながら、データ値としてフィールド名を持つDBエントリが作成されたため、これは実際には機能しませんでした。このスクリプトはエラーを投げずに実行していたので、今朝はデータベースを見たときに(一晩実行する)、適切な値を持たなかったのです。 – Trcx

1

しかし、私がいないすべての辞書のエントリがテーブルのすべての列が含まれて問題を抱えていたがゆえ私は、次の解決策

keys, values = zip(*Package.items()) 
insert_str = "INSERT INTO packages (%s) values (%s)" % (",".join(keys),",".join(['?']*len(keys))) 
cursor.execute(insert_str,values) 
関連する問題