2017-09-20 17 views
0

誰かが私にそれをバグか機能と説明できますか?MariaDB executemanyはDebian Stretchの重複キーにあります

  • Debianのストレッチ
  • mariadb-サーバ10.1.26
  • mariadb-クライアント10.1.26
  • のMySQLdb-1.2.5

このPythonコードはperfectlly Debianのジェシーに動作しますエラーが発生して伸びに失敗しました:

Traceback (most recent call last): 
    File "bug_check.py", line 17, in <module> 
    cur.executemany(q, p) 
    File "/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 255, in executemany 
    self.errorhandler(self, TypeError, msg) 
    File "/usr/local/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
TypeError: not all arguments converted during string formatting 

Pythonコード:

#!/usr/bin/python 
# -*- coding: UTF-8 * 

import MySQLdb 

db = MySQLdb.connect(host='192.168.1.183', user='root', passwd='password', db='test', charset='utf8') 
cur = db.cursor() 

q = """INSERT INTO test2 (id, value) 
    VALUES (%s, %s) 
    ON DUPLICATE KEY 
    UPDATE value=%s 
    """ 

p = [(1, 7, 7)] 

# failed 
cur.executemany(q, p) 

# working 
for i in p: 
    cur.execute(q, i) 

db.commit() 
db.close() 

データベース:

CREATE TABLE `test2` (
    `id` bigint(8) NOT NULL, 
    `value` float NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `test2` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `test2` 
    MODIFY `id` bigint(8) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1; 

私は、pymysqlをmariadb-10.2をしようとしていますが、いずれにしてもエラーがストレッチで発生します。

答えて

0

これは仕事があります。UPDATE value=VALUES(value)UPDATE value=%sを変更し、配列内の最後の7を取り除きます。

それは、ここでは、動作しない場合はより多くの議論です:

私はexecutemany

INSERT ... 
    VALUES (...), 
      (...), 
      (...); 

を構築しようとしていると思う。しかし、それは次のように繰り返さリストにIODKU構文を変換する方法を知りません。それ。ボトムライン:あなたはおそらくIODKU INSERTexecutemanyINSERT IGNOREREPLACEを使用しますが、できません。 IODKUが機能するために

、ストレッチがこれを行うには十分にスマートにする必要がある:繰り返しが、他の例のように、中央ではなく端にあることを

INSERT INTO test2 (id, value) 
    VALUES 
     (%s, %s), 
     (%s, %s), 
     (%s, %s), 
     (%s, %s), 
     etc 
    ON DUPLICATE KEY 
    UPDATE value=VALUES(value) 

は注意を。ただしあなたはUPDATE句で%sを避けるためにVALUES()擬似関数を使用する必要が

+0

多くの感謝! DUPLICATE KEY UPDATE値= VALUES(値) '' ' ON ' '' TEST2。INSERT INTO(ID、値) VALUES(%sの%sの)しかし、なぜ同じ、私は理解していない:それは働いていますコードはWheezyとJessieで動作しますが、Stretchでは動作しません。私はMySQLdb/pymysqlの同じバージョンを持っています。 'mariadb-client-10.1'は' mariadb-client-10.1'と互換性がありません。しかし、私は何か情報を見つけることができませんでした。 –

+0

私はコードが完全にクライアント側にあると思います。ストレッチのような音がバギーですか?しかし、それは正しいOS名ですか? OSは関与すべきではありません。 Busterにある場合は、Debianに対するバグレポートを書いてください。 –

関連する問題