【问题标题】:Issues updating a MySQL table using Python's MySQLdb使用 Python 的 MySQLdb 更新 MySQL 表的问题
【发布时间】:2010-08-26 07:53:15
【问题描述】:

我正在尝试使用 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)}

我认为这个问题可能与用户名有关,因为如果我删除它,更新就会起作用。但当然我需要使用它......

任何指针/建议将不胜感激。

非常感谢,

乌奈·罗德里格斯

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

伙计们,我正在使用以下“丑陋”的解决方法...有效:

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(第一次实施)有什么问题。我将暂时保留这样的脚本。非常感谢。

【问题讨论】:

    标签: python sql mysql


    【解决方案1】:

    您是否在更新后尝试 COMMIT 命令如下?

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

    【讨论】:

    • 感谢您的帮助!!仍然没有工作,这是我尝试过的: 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], 用户名, 月, 年)) cursor.connection.commit(); print "Username: %s; Rowcount: %d" % (username, cursor.rowcount)
    • @UnaiRodriguez 为什么是';'在 python 中?
    【解决方案2】:

    这个答案可能有点晚,但为了后代:

    在您的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()
    

    【讨论】:

    • 看起来不错,但是第一行有一个错字(bd 而不是 db)
    【解决方案3】:

    您能否检查表中的username 和查询中的username 是否具有相同的长度?如果表中有任何填充(带有空格字符),它可能不会显示在 SQL 命令提示符中,并且会导致更新匹配零行。

    您还可以将表的主键 (id) 与 yearmonth 一起传递,而不是 username

    【讨论】:

    • 我检查了,没有空格。我也没有 id,我只有脚本上的用户名。
    • 我现在正在做的,有点难看但有效,是先删除该行然后插入它(而不是更新)。
    【解决方案4】:

    我发现由于某种原因 python 不读取 %s。所以用?而不是 SQL 代码中的 %S。

    最后这对我有用。

      cur.execute ("update tablename set columnName = (?) where ID = (?) ",("test4","4"))
    

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 2015-09-02
      • 2011-09-01
      • 2017-05-08
      • 2016-06-25
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多