2011-02-02 5 views
2

のpythonのMySQLdb executemany()で呼び出しますその括弧が値ブロックの終わりとして認識されるためです。つまり、クエリは次のようになります。含むDB機能は、私のようなステートメントを実行しようとすると

('1', 'a', NOW(), ('2','b', NOW(), ('3','c',NOW()) 

MYSQLは構文エラーを報告します。代わりに、彼らは次のようになります:

NOW()をエスケープするいくつかの方法があるはずですが、どのように把握できません。タプルに 'NOW()'を追加することは、NOW()が引用され、関数呼び出しではなく文字列としてDBによって解釈されるために機能しません。

デフォルト値として現在のタイムスタンプを使用することでこれを回避することはオプションではありません。これは一例ですが、私はこの種のことを今やさまざまなdb関数で行う必要があります。

ありがとう!

答えて

1

以下の方法は理想とはかけ離れていますが、残念ながら、私が知る唯一の方法です。

アイデアがあなたの引数をエスケープするconnection.literalを使用して、手動でSQLを構築することである。

cursor=connection.cursor() 
args=[(1,'foo'),(2,'bar')] 
sql=('INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES ' 
    +','.join(
     ['(%s,%s,NOW())'%connection.literal(arg) 
      for arg in args])) 
cursor.execute(sql) 

これは恐ろしい見え、お肌のクロールを作ることはできますが、ボンネットの下に見れば(中/私はこれが正規表現のために関数が行っているのと同じ行にあると思います。cursors.insert_values正しく解析していません。ネストされたかっこ。 (EEK!)


私はちょうどinstalled oursql、MySQLdbは代わりにきた、とoursqlで期待通り

sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())' 
cursor.executemany(sql,args) 

に動作することを報告して満足しています。

+0

ヤック。私はちょうどその下のコードを見ました。その正規表現には何か問題があります。報告されているバグであるようです。 [link](http://sourceforge.net/tracker/index.php?func=detail&aid=2137599&group_id=22307&atid=374932) –

+0

ありがとうございます私たちのSQL –

関連する問題