6

次のスクリプトを使用して、重複キーの更新で多くのPythonを実行しようとしています。

# data from a previous query (returns 4 integers in each row)
rows = first_cursor.fetchall()

query="""
INSERT INTO data (a, b, c)
VALUES (%s,%s,%s) ON DUPLICATE KEY UPDATE a=%s
"""
second_cursor.executemany(query,rows)

このエラーが発生します:

File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 212, in executemany
  self.errorhandler(self, TypeError, msg)
File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler
  raise errorclass, errorvalue
TypeError: not all arguments converted during string formatting

これは、独自のループを作成しなくても可能ですか?

4

4 に答える 4

11

INSERTこれは、MySQLdb がステートメントを解析するために使用する正規表現による MySQLdb のバグです。

/usr/lib/pymodules/python2.7/MySQLdb/cursors.py : _

restr = (r"\svalues\s*"
        r"(\(((?<!\\)'[^\)]*?\)[^\)]*(?<!\\)?'"
        r"|[^\(\)]|"
        r"(?:\([^\)]*\))"
        r")+\))")

insert_values= re.compile(restr)

この問題に関して、修正済みとしてクローズされた多数のバグ レポートがありましたが、MySQLdb バージョン 1.2.3 でエラーを再現することができました。(現時点での MySQLdb の最新バージョンは 1.2.4b4 です。)

このバグは修正可能かもしれませんが、私にはよくわかりません。しかし、これは氷山の一角に過ぎないと思います。これは、さらに多くの問題が潜んでいることを示しています。INSERT ... SELECTたとえば、条件とパラメーターが散りばめられたネストされたSELECTステートメントを含むステートメントを持つことができますWHERE...これらのケースを処理するために正規表現をますます複雑にすることは、私には負け戦のように思えます。

oursqlを使用できます。正規表現や文字列の書式設定は使用しません。パラメータ化されたクエリと引数をサーバーに別々に渡します。

于 2012-10-10T18:02:22.770 に答える
6

次のようにSQLを書くと:

sql = insert into A (id, last_date, count) values(%s, %s, %s) on duplicate key update last_date=%s, count=count+%s'

次のエラーが表示されます。TypeError: not all arguments converted during string formatting.

したがって"ON DUPLICATE KEY UPDATE"、Python で使用する場合は、次のように sql を記述する必要があります。

sql = 'insert into A (id, last_date, count) values(%s, %s, %s) on duplicate key update last_date=values(last_date),count=count+values(count)' 
于 2018-05-25T09:24:50.923 に答える
0

ubuntu が言ったように、これは mysqldb のバグです。SQL を少し変更すると動作します。

insert into tb_name(col1, col2) select 1,2 on duplicate key update col1=1
于 2015-06-05T03:19:52.883 に答える