2017-09-20 13 views
0

누구나 나를 버그 또는 기능으로 설명 할 수 있습니까?MariaDB executemany가 데비안에서 중복 키를 사용함 Stretch

  • 데비안 스트레치
  • mariadb - 서버 10.1.26
  • mariadb 클라이언트 - 10.1.26
  • MySQLdb-1.2.5

이 파이썬 코드가 perfectlly 데비안 제시 작동 오류가있는 스트레치에서 오류가 발생했습니다.

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 

파이썬 코드 :

#!/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() 

데이터베이스 : 나는 mariadb-10.2, pymysql 어쨌든 오류가 스트레치에서 발생 노력하고

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; 

.

답변

0

일 수 UPDATE value=VALUES(value)UPDATE value=%s을 변경하고 배열의 마지막 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) 

참고. 그러나 UPDATE 절에있는 %s을 피하기 위해 VALUES() 가상 함수를 사용해야합니다.

+0

많은 감사! 일하고 : 이 '''TEST2 INTO INSERT (아이디, 값) VALUES (% s의 % s의) 중복 키 UPDATE 값 = 값에 대한 (값)''' 하지만 이해할 수없는 이유를 동일 코드는 Wheezy와 Jessie에서 작동하지만 스트레치에서는 작동하지 않습니다. 나는 MySQLdb/pymysql의 같은 ​​버전을 가지고있다. 가능한'mariadb-client-10.1'은'mariadb-client-10.1'과 호환되지 않는 변경 사항을 가지고 있습니다. 하지만 뭔가 정보를 찾을 수 없습니다. –

+0

나는이 코드가 전적으로 클라이언트 측에 있다고 생각한다. 스트레치 소리가 들리는가? 하지만 OS 이름이 맞습니까? OS가 관련되어서는 안됩니다. Buster에 있다면 데비안에 대한 버그 보고서를 작성하십시오. –