使用Python的MySQLdb更新MySQL表时的问题

3 投票
4 回答
4107 浏览
提问于 2025-04-16 03:19

我正在尝试用Python的MySQLdb模块来更新一个MySQL表。虽然这个查询看起来很简单,但就是无法更新信息。以下是我的代码:

for username,info in users.iteritems():
  if info[0] > 0 and info[1] > 0:
    month = 8
    year = 2010
    cursor.execute("""
        UPDATE users_disk
        SET
            bytes = %s,
            quota_in_mb = %s
        WHERE
            username = %s AND
            month = %s AND
            year = %s
        """, (info[0], info[1], username, month, year))
    print "Username: %s; Rowcount: %d" % (username, cursor.rowcount)

输出结果是这样的:

Username: niu666; Rowcount: 0
Username: antuan; Rowcount: 0
Username: tuyo; Rowcount: 0
Username: angela; Rowcount: 0
Username: felipe; Rowcount: 0
Username: Meni; Rowcount: 0
Username: tronco; Rowcount: 0
Username: queque; Rowcount: 0
Username: cerel; Rowcount: 0

这意味着没有任何行被更新!这个表的内容如下:

mysql> select * from users_disk;
+----+----------+-------+------+---------+-------------+
| id | username | month | year | bytes   | quota_in_mb |
+----+----------+-------+------+---------+-------------+
|  1 | niu666   |     8 | 2010 |   28672 |     1024000 | 
|  2 | antuan   |     8 | 2010 |   77824 |     4608000 | 
|  3 | tuyo     |     8 | 2010 |   28672 |     1024000 | 
|  4 | angela   |     8 | 2010 |   45056 |     2048000 | 
|  5 | felipe   |     8 | 2010 |   53248 |      307200 | 
|  6 | Meni     |     8 | 2010 |   86016 |     4096000 | 
|  7 | tronco   |     8 | 2010 | 3067904 |     1024000 | 
|  8 | queque   |     8 | 2010 |   61440 |     4608000 | 
|  9 | cerel    |     8 | 2010 |  110592 |     5632000 | 
+----+----------+-------+------+---------+-------------+
9 rows in set (0.00 sec)

而users是一个字典,内容如下:

{'niu666': (28672, 1024000), 'tutk': (-1, -1), 'antuan': (77824, 4608000), 'tolin': (-1, -1), 'tuyo': (28672, 1024000), 'angela': (45056, 2048000), 'felipe': (53248, 307200), 'Meni': (86016, 4096000), 'tronco': (3067904, 1024000), 'queque': (61440, 4608000), 'cerel': (110592, 5632000), 'carok': (-1, -1), 'niu': (-1, -1)}

我觉得问题可能和用户名有关,因为如果我去掉它,更新就能成功。但我当然需要用到它...

如果有任何建议或推荐,我会非常感激。

非常感谢,

Unai Rodriguez

-------------------------- 更新 -------------------------

大家,我正在使用以下这种“丑陋”的变通方法... 这个方法有效:

for username,info in users.iteritems():
    if info[0] > 0 and info[1] > 0:
        # The user has positive values, its valid!
        cursor.execute("DELETE FROM " + dbtable + " WHERE username = %s AND month = %s AND year = %s", \
            (username, month, year))
        cursor.execute("INSERT INTO " + dbtable + " (id, username, month, year, bytes, quota_in_mb) VALUES (NULL, %s, %s, %s, %s, %s)", \
                                            (username, month, year, info[0], info[1]))

不过我还是想知道第一次实现的UPDATE出了什么问题。现在我就先这样保留这个脚本。非常感谢。

4 个回答

0

你能检查一下表格中的username和查询中的username长度是否相同吗?如果表格中的username有填充的空格,这些空格可能在SQL命令提示符中看不见,这样会导致更新时找不到任何匹配的行。

另外,你能否在传递数据时,把表格的主键idyearmonth一起传入,而不是username呢?

1

这个回答可能来得有点晚,但为了后人着想,我还是说一下:

在你执行完 cursor.execute( <SQL_HERE> ) 之后,一定要记得调用 connection.commit()

一个正确的方法是:

import MySQLbd
from contextlib import closing

connection = MySQLdb.connect( host="localhost",
                              user="root",
                              passwd="root",
                              db="tableName")

with closing( connection.cursor() ) as cursor:
    try:
        cursor.execute( "SQL UPDATE CODE" )
        connection.commit()
    except:
        connection.rollback()
6

你在更新之后,有试过使用 COMMIT 命令吗?

cursor.execute("UPDATE animals SET species=%s WHERE name=%s",('TEST', 'Rollo'))

cursor.connection.commit();

撰写回答