【问题标题】:mysql.connector for python commit() does not workpython commit() 的 mysql.connector 不起作用
【发布时间】:2017-05-11 16:35:01
【问题描述】:

我想在 sql 表中转换日期格式,但我不知道为什么这不起作用:

import mysql.connector
from mysql.connector import errorcode
from dateutil.parser import parse

appname = "dropbox"

# connect to the database
# Add your DB connection information

try:

    database = mysql.connector.connect(user='root', password='root',

                              host='localhost',

                              database='google_play')

except mysql.connector.Error as err:

    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong with your user name or password")

    elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exist")

    else:
        print(err)

DBcursor = database.cursor(buffered=True)
DBcursor2 = database.cursor(buffered=True)

# DB connection established. Now get the table:

query = ("SELECT * FROM googleplay_%s_test" % appname)

DBcursor.execute(query)

# Execute the date conversion:

for (id, user_name, date, url, rating, title, text, reply_date, reply_text) in DBcursor:

    date_string = parse(date)
    date_string.strftime("%Y-%m-%d")

    conversion = ("UPDATE googleplay_%s_test SET date='date_string' WHERE id='id'" % appname)

    DBcursor2.execute(conversion)

    database.commit()

    print("Convertet to: ", date_string)

# close the database connection

DBcursor.close()
DBcursor2.close()
database.close()

转换似乎有效。输出是:

Convertet to:  2016-12-02 00:00:00
Convertet to:  2016-11-25 00:00:00
Convertet to:  2016-11-16 00:00:00
Convertet to:  2016-12-04 00:00:00

这很好。但是,它不会将新值写入表中。首先,我认为缺少 commit() 命令,但它就在那里。

【问题讨论】:

  • 如果你需要使用参数来确定你的表应该是什么,那就意味着底层的表设计存在很大问题。

标签: python mysql mysql-connector


【解决方案1】:

这个:

conversion = ("UPDATE googleplay_%s_test SET date='date_string' WHERE id='id'" % appname)
DBcursor2.execute(conversion)

显然不会将googleplay_<whatever>_test 设置为date_string 变量的值 - 它会尝试将其设置为乱七八糟的'date_string' 字符串。很可能 MySQL 只是默默地跳过操作(嗯,最多可能发出警告)并假装一切正常,就像使用默认 MySQL 设置一样。

编辑:同样适用于where 子句:

WHERE id='id'

只会尝试更新 id 为文字字符串 'id' 的记录。

你想要:

 conversion = "UPDATE googleplay_%s_test SET date=%%s WHERE id=%%s" % appname
DBcursor2.execute(conversion, [date_string, id])

FWIW 如果你只需要两个字段,你最好只检索这两个字段:

query = "SELECT id, date FROM googleplay_%s_test" % appname
DBcursor.execute(query)

for id, date in DBcursor:
    # code here

当我们这样做的时候:

  1. cursor.execute() 返回受查询影响(选择、更新、删除等)的行数
  2. 您可能希望将您的database.commit() 排除在循环之外 - 一次提交会更快,并且还可以确保应用所有更改或不应用所有更改,从而避免使您的数据库处于半支持状态。

还请注意,您在这里传递的date_string 实际上不是字符串,而是datetime.datetime 对象,因为您丢弃了对date_string.strftime() 的调用结果。但这应该没问题,dbapi 连接器应该知道如何在 db 和 python 类型之间进行转换。

最后:一个正确的数据库模式应该有一个googleplay_test 表,其中appname 作为一个字段。

【讨论】:

  • 感谢您的帮助。不幸的是,它并没有太大变化。它仍然没有将新值写入表中。
  • 您在 where 子句中遇到了同样的问题,请参阅我的编辑。你可以从我的回答 FWIW 中发现它......
  • 完美!现在它正在工作。非常感谢您的帮助!
猜你喜欢
  • 2020-12-20
  • 2020-10-08
  • 2022-10-20
  • 1970-01-01
  • 2013-02-26
  • 2014-05-11
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多