首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Debian拉伸中重复密钥的MariaDB执行

Debian拉伸中重复密钥的MariaDB执行
EN

Stack Overflow用户
提问于 2017-09-20 09:40:04
回答 1查看 260关注 0票数 0

有人能解释一下吗?是窃听器还是特写?

  • Debian拉伸
  • mariadb-server-10.1.26
  • mariadb-client-10.1.26
  • MySQLdb-1.2.5

这个python代码在Debian中很好地工作,但是在扩展过程中失败了,出错了:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
#!/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()

数据库:

代码语言:javascript
复制
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,但是无论如何,在拉伸过程中会出现错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-20 17:26:53

这可能会奏效:将UPDATE value=%s更改为UPDATE value=VALUES(value),并去掉数组中的最后一个7

如果这样做不起作用,下面将进行更多的讨论:

我认为executemany正在尝试构建

代码语言:javascript
复制
INSERT ...
     VALUES (...),
            (...),
            (...);

但是它不知道如何将IODKU语法转换成这样的重复列表。底线:您可能可以将executemanyINSERTINSERT IGNOREREPLACE一起使用,但不能使用IODKU。

要想让IODKU工作,拉伸需要足够聪明才能做到这一点:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46318523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档