更新:我认为最好在代码中提及该列表是从 tk.Entry 生成的。
当值中包含下划线时,更新 MySQL 中的列不起作用。
该列采用字符串格式,要更新的值取自列表。
错误:“字段列表”中存在未知列“2020_05_01”
如果 list_tu = [2020_05_01, 2020_05_02] # ===> 不起作用
如果 list_tu = [2, 3] # ===> 有效
附言如果我将列格式更改为 DATE,那么当我在 tkinter 输入字段中输入该值 2020-05-01 时,会出现以下错误:
日期值不正确:第 1 行“Expiration_date”列的“2014”
entries = [Entry(self.edit_wind, font =('Calibri', 7 )) for _ in range(2)]
for entry in entries:
entry.pack()
list_tu = list()
def get_entry():
for entry in entries:
data_1 = entry.get()
list_tu.append(data_1)
return list_tu
ids_list = [8, 9]
def insert_tu():
conn = connection_forward_db
cursor = conn.cursor()
for tu, ids in zip(list_tu, ids_list):
cursor.execute('UPDATE tableA SET Expiration_date = '+tu+' WHERE DB_id = '+str(ids)+'')
conn.commit()
最佳答案
编辑:此处出现特定错误消息的原因是 MySQL 查询需要在字符串值周围加上引号。为了演示,即使您将带下划线的日期指定为原始列表中的字符串,使用您当前的代码生成的查询也将是这样的:
UPDATE tableA SET Expiration_date = 2020_05_01 WHERE DB_id = 8
您希望它看起来像这样:
UPDATE tableA SET Expiration_date = '2020_05_01' WHERE DB_id = 8
因此您需要在原始执行行中添加一些引号,如下所示:
cursor.execute('UPDATE tableA SET Expiration_date = \''+tu+'\' WHERE DB_id = '+str(ids)+'')
这些必须使用 \
进行转义,以防止 python 将它们解释为字符串的分隔符。您还可以使用双引号作为分隔符以避免转义它们:
cursor.execute("UPDATE tableA SET Expiration_date = '"+tu+"' WHERE DB_id = "+str(ids)+"")
我的另一个建议是使用 parameterised queries ,而不是将变量值直接拼接到查询字符串中。如果这些值来自用户输入(或者将来有可能这样做),则查询可能会出现 SQL injection attack 。目前尚不清楚您使用什么连接库来连接 MySQL,但所有好的连接库都应该提供某种使用参数化查询的方法。使用参数化查询还意味着您不必担心诸如确保在查询字符串中添加引号之类的事情。
作为一个额外的建议,MySQL 中有一个 date
类型可能更适合您存储 Expiration_date
字段的需求。使用该类型将允许您将其他日期与它进行比较以及其他有用的功能(例如从日期获取星期几)。在这种情况下,需要提供如下日期:
list_tu = ["2020-05-01", "2020-05-02"]
(其他格式也可以接受,但据我所知不支持下划线。)
关于mysql - 当值是 XX_YY_ZZ 形式但没有下划线时,使用 TKinter 中的 Entry 更新 MySQL 中的表会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57003231/