我想在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()命令缺失了,但它就在那里。
答案 0 :(得分:0)
这样:
conversion = ("UPDATE googleplay_%s_test SET date='date_string' WHERE id='id'" % appname)
DBcursor2.execute(conversion)
显然不会将googleplay_<whatever>_test
设置为date_string
变量的值 - 它会尝试将其设置为litteral 'date_string'
字符串。机会是MySQL只是默默地跳过操作(好吧,也许最好发出警告)并假装一切都没问题,通常使用默认的MySQL设置。
编辑:同样适用于where
子句:
WHERE id='id'
只会尝试更新id为litteral字符串'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()
返回查询影响(选择,更新,删除等)的行数database.commit()
置于循环之外 - 单个提交更快,并确保应用所有更改或不应用任何更改,从而避免将数据库置于半支持状态另请注意,您在date_string
传递的内容实际上不是字符串而是datetime.datetime
对象,因为您放弃了对date_string.strftime()
的调用结果。但是应该没问题,dbapi连接器应该知道如何在db和python类型之间进行转换。
最后:正确的数据库架构将有一个googleplay_test
表,其中appname
为字段。