gpt4 book ai didi

python - python commit() 的 mysql.connector 不起作用

转载 作者:行者123 更新时间:2023-11-29 19:41:08 26 4
gpt4 key购买 nike

我想转换 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() 命令丢失了,但它确实存在。

最佳答案

这个:

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

显然不会设置googleplay_<whatever>_testdate_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_testappname作为一个字段。

关于python - python commit() 的 mysql.connector 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41344332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com