2017-07-21 31 views
0

mysqldbを使用してデータベース内の多くのレコードを更新しようとしています。executemanyを使用してpandasデータフレームからmysqlデータベースを更新する

cur.executemany("""UPDATE {} set {} =%s Where id = %s """.format(table, ' = %s, '.join(col)),updates.values.tolist()) 

私はそのエラーメッセージは次のコードを使用して有用ではなかったように、私は、実際のSQL UPDATE文を出力しようとした

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near... 

...エラーメッセージが表示されます。

cur.execute('set profiling = 1') 
    try: 

     cur.executemany("""UPDATE {} set {} =%s Where id = %s """.format(table, ' = %s, '.join(col)),updates.values.tolist()) 
    except Exception: 
     cur.execute('show profiles') 
     for row in cur: 
      print(row) 

そのprintステートメントは、更新ステートメントを300文字で切り取っているようです。私は制限についてのドキュメントで何も見つけることができませんので、これは印刷の文が制限されているのか、それともmysqldbですか?

完全なステートメントを表示するために、mysqldbではなく、pythonという更新ステートメントを生成する方法はありますか?

答えて

1

カーソルが何を実行していたのかを正確に確認するには、APIにhereのようにcursor.statementコマンドを使用できます。それはデバッグに役立つかもしれません。

私はmySQLアダプタの経験はありませんが、私は毎日PostgreSQLアダプタを使用しています。少なくともその文脈では、クエリ文字列を直接書式化せずに、cursor.execute文の2番目の引数に置換を実行させることをお勧めします。これにより、引用符で囲まれた文字列などの問題を回避できます。ここでの例であり、もう一つは(少なくともPostgresのための)正しい:

cur.execute("""UPDATE mytbl SET mycol = %s WHERE mycol2 = %s""".format(val, cond)) 

cur.execute("""UPDATE mytbl SET mycol = %(myval)s WHERE mycol2 = %(mycond)s""", {'myval': val, 'mycond': cond}) 

これは、クエリ

UPDATE mytbl SETのmycol = ABC WHERE mycol2 = XYZ

をもたらすことができます代わり

UPDATE mytbl SETのmycol = 'ABC' mycol2は= 'XYZ' の

クエリで値の置換を行う場合は、明示的に追加する必要があります。これは煩わしくなり、データベースアダプタの型処理を邪魔します(これは単なるテキストの例です)。この記法とcursor.executemanyコマンドの詳細については、See the APIを参照してください。

関連する問題