2016-06-30 15 views
0

私はPythonでMySQLdbモジュールを使用してSQL文を記述しています。私は、私が望むやり方で変数を使用するのは難しい時を過ごしています。ここに私の仕事です:これは動作しませんPythonのSQL文にexecute()/ executemany()を使用

stmt = "\ 
INSERT INTO Table1\ 
(name, status)\ 
SELECT (:name1, :status1)\ 
     FROM dual\ 
WHERE NOT EXISTS (\ 
     SELECT 1 FROM Table1\ 
     WHERE name =(:name1))" 
dic = {"name1":"Bob", "status1":"Active"} 

dbcursor.executemany(stmt, dic) 
dbconnection.commit() 
print("Insertion to Table1 committed\n\n") 

、私は最終的にエラーメッセージが表示さnot all arguments converted during string formattingをロールバックします。辞書の値をハードコードすると、挿入が正常に機能します。ハードコードされた値の代わりに変数を使用する適切な方法を教えてください。

+1

ヒント: '" "" "" "' '三重引用符を使用すると、これらの円記号をすべて使用する必要はありません。 –

+0

すべてがロールバックされている場合は例外がありますか? –

+0

@MartijnPietersはい、「文字列書式中にすべての引数が変換されない」 –

答えて

0

executemany()は、パラメータオブジェクト(辞書)のシーケンスがかかりますが、あなただけのに渡しています。 dbcursor.execute()を使用するか、一連の辞書を渡します。別の​​呼び出しで使用されるそれぞれの一連のパラメータとしてexecutemany()扱い2番目の引数は、あなたが効果的でステートメントを実行しようとしているので

dbcursor.execute(stmt, dic) 

:あなたは一つだけの辞書を持っているので、ちょうどdbcursor.execute()を使用パラメータとして辞書のキーを使用します。実際には、あなたのdicなどのパラメータに渡すと、生成します。

for key in dic: 
    dbcursor.execute(stmt, key) 

キーも使用するパラメータとして生産、反復可能な別の文字です。 ('n', 'a', 'm', 'e', '1')('s', 't', 'a', 't', 'u', 's', '1')のステートメントを実行しようとしています。それはあなたの声明では機能しません。

+0

これを試しました。エラーが私の構文をチェックするように指示しているので、これは進歩しており、SQLのバージョンで構文規則がチェックされています –

関連する問題