mysql.connector 对于 python commit() 不起作用
mysql.connector for python commit() does not work
我想在 sql table 中转换日期格式,但我不知道为什么这不起作用:
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
很好。但是,它不会将新值写入 table。首先,我认为 commit() 命令丢失了,但它就在那里。
这个:
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
当我们在做的时候:
cursor.execute()
returns 查询影响(选择、更新、删除等)的行数
- 您可能希望将您的
database.commit()
置于循环之外 - 一次提交速度更快,并且还确保应用所有更改或 none 应用,这避免离开您的数据库处于半背状态。
另请注意,您在此处作为 date_string
传递的实际上不是字符串,而是 datetime.datetime
对象,因为您丢弃了对 date_string.strftime()
的调用结果。但这应该没问题,dbapi 连接器应该知道如何在 db 和 python 类型之间转换。
最后:一个合适的数据库模式应该有一个 googleplay_test
table 和 appname
作为字段。
我想在 sql table 中转换日期格式,但我不知道为什么这不起作用:
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
很好。但是,它不会将新值写入 table。首先,我认为 commit() 命令丢失了,但它就在那里。
这个:
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
当我们在做的时候:
cursor.execute()
returns 查询影响(选择、更新、删除等)的行数- 您可能希望将您的
database.commit()
置于循环之外 - 一次提交速度更快,并且还确保应用所有更改或 none 应用,这避免离开您的数据库处于半背状态。
另请注意,您在此处作为 date_string
传递的实际上不是字符串,而是 datetime.datetime
对象,因为您丢弃了对 date_string.strftime()
的调用结果。但这应该没问题,dbapi 连接器应该知道如何在 db 和 python 类型之间转换。
最后:一个合适的数据库模式应该有一个 googleplay_test
table 和 appname
作为字段。