2017-09-20 17 views
0

Quelqu'un pourrait-il m'expliquer s'il s'agit d'un bug ou d'une fonctionnalité?MariaDB executemany sur une clé dupliquée dans Debian Stretch

  • extensible Debian
  • MariaDB-server-10.1.26
  • MariaDB-client-10.1.26
  • MySQLdb-1.2.5

Ce code python fonctionne perfectlly dans Debian Jessie , mais échoué dans Stretch avec erreur:

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 

Code 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() 

Base de données:

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; 

Je suis en train MariaDB-10.2, mais de toute façon pymysql erreur se produit en stretch.

Répondre

0

Ce peut travail: Changer UPDATE value=%s-UPDATE value=VALUES(value) et de se débarrasser du dernier 7 dans le tableau.

Si cela ne fonctionne, alors voici plus de discussion non:

Je pense que executemany est en train de construire

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

Mais il ne sait pas comment convertir la syntaxe IODKU dans une liste répétée comme cette. Bottom line: vous pouvez probablement utiliser executemany avec INSERT, INSERT IGNORE, REPLACE, mais pas IODKU.

Pour IODKU travailler, doivent être encore assez intelligent pour le faire:

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

Notez que la répétition est au milieu, non pas sur la fin, comme dans les autres cas. Cependant vous devez utiliser la pseudo-fonction VALUES() pour éviter le %s dans la clause UPDATE.

+0

Merci beaucoup! Il travaille: '' 'INSERT INTO test2 (id, valeur) VALEURS (% s,% s) Duplicate CLÉS valeur UPDATE = VALEURS (valeur)' '' Mais je ne comprends pas pourquoi le même code fonctionne dans Wheezy et Jessie mais ne fonctionne pas dans Stretch. J'ai les mêmes versions de MySQLdb/pymysql. Possible 'mariadb-client-10.1' a des changements incompatibles avec' mariadb-client-10.1'. Mais je n'ai pas pu trouver quelque chose d'info. –

+0

Je pense que le code est entièrement du côté client. On dirait que Stretch est buggé? Mais c'est un nom d'OS, correct? L'OS ne devrait pas être impliqué. Si c'est dans Buster, écrivez un rapport de bogue sur Debian. –