2017-09-20 65 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的錯誤報告。 –