python - MariaDB 在 Debian Stretch 中对重复键执行许多操作

标签 python mysql mariadb insert-update upsert

谁能解释一下这是错误还是功能?

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

此 python 代码在 Debian Jessie 中完美运行,但在 Stretch 中失败并出现错误:

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,但无论如何,Stretch 中都会出现错误。

最佳答案

可能有效:更改UPDATE value=%sUPDATE value=VALUES(value)并摆脱最后一个 7在数组中。

如果这不起作用,那么这里有更多讨论:

我认为executemany正在尝试构建

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

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

为了让 IODKU 发挥作用,Stretch 需要足够智能才能做到这一点:

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

请注意,重复位于中间,而不是像其他情况一样位于末尾。但是必须使用VALUES()伪函数以避免 %sUPDATE条款。

关于python - MariaDB 在 Debian Stretch 中对重复键执行许多操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46318523/

相关文章:

python - 在 Python 中创建二维数组

mysql - 当我尝试仅从一个用户获取数据时,查询从两个不同用户获取数据

mysql - UTF-8字符有问题;我看到的不是我存储的

python - 这个函数即使不调用自身也是递归的吗?

python - 从 QWebEngineProfile 获取 cookie 作为字典

mysql - 带子查询的 ON DUPLICATE KEY UPDATE 查询

php - 注意 : Undefined index: userid in. .. PHP 不发送隐藏的输入 id

mysql - 如何在 MySQL 中获取当前的舍入时间?

python - 加速从 pandas dataframe 到 mysql 的数据插入

python - Django new ForeignKey 字段基于现有字段