2017-09-20 66 views
0

任何人都可以解释我是它的错误还是功能?MariaDB执行重复密钥在Debian Stretch

  • Debian的弹力
  • MariaDB的服务器 - 26年1月10日
  • MariaDB的客户端,26年1月10日
  • 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; 

我想MariaDB的-10.2,在拉伸时pymysql但无论如何错误。

回答

0

This may work:将UPDATE value=%s更改为UPDATE value=VALUES(value)并删除数组中的最后一个7

如果还是不行,那么这里就是更多的讨论:

我觉得executemany正在努力打造

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

但它不知道如何将IODKU语法转换成像重复列表那。底线:您可能可以使用executemanyINSERT,INSERT IGNORE,REPLACE,但不是IODKU。

对于IODKU工作,弹力必须足够聪明,这样做:

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

注意,重复是在中间,而不是结束,在其他情况下。但是必须使用VALUES()伪函数来避免UPDATE子句中的%s

+0

非常感谢!它的工作: '''INSERT INTO TEST2(ID,值) VALUES(%S,S) 对重复KEY UPDATE值= VALUES(值)''' 但我不明白为什么同样的代码适用于Wheezy和Jessie,但不适用于Stretch。我有相同版本的MySQLdb/pymysql。 可能的'mariadb-client-10.1'与'mariadb-client-10.1'有不兼容的变化。但我找不到什么信息。 –

+0

我认为代码完全在客户端。听起来像拉伸是越野车?但是,这是一个操作系统的名称,对吗?操作系统不应该参与。如果是在Buster,写一个针对Debian的错误报告。 –