我有 python (3.4) 代码,光标不会将其提交到数据库。如果我通过 MySQL 客户端手动输入更改,我可以提交更改(因此我确定我UPDATE
对相关表具有权限)。此代码仅使用 csv 文件中的信息更新表:
#!/bin/python3.4
import mysql.connector
import csv
import sys
cnx = mysql.connector.connect(user='me', password=sys.argv[1] , host="localhost", database="mydb")
cursor = cnx.cursor()
csvfile = open("products.csv", 'r', newline='')
products = csv.DictReader(csvfile, delimiter = ',', quotechar='"', skipinitialspace=True)
update_product= ("UPDATE products SET "
"ticket_price = %(ticket_price)s, "
"quantity_ordered = %(quantity_ordered)s "
"WHERE product_code = \"%(product_code)s\";"
)
for row in products:
data = {
"product_code":row["product_code"],
"ticket_price":row["ticket_price"],
"quantity_ordered":row["quantity_ordered"]
}
cursor.execute(update_product, data)
print(row["product_code"] + " quantity_ordered: " + row["quantity_ordered"])
# Commit to the database
cnx.commit()
cursor.close()
csvfile.close()
cnx.close()
因为它是一个准备好的语句,我不相信我可以检索到实际执行的 SQL 字符串(但调用print(update_product % data)
让我看看语句应该如何出现)。从手动复制粘贴到 python 解释器,我相信 SQL 是好的(cursor.fetchwarnings()
不抱怨)。输入数据好;打印语句正确读取。它只是不会提交 - 对于这些行,数据库中的所有信息都保持为零。我已经将此脚本与几乎相同的脚本进行了比较,似乎没有什么不同。我也试过cnx.autocommit = True
了,也不行。
任何人都知道出了什么问题,或者如何获取cursor.execute()
和connector.commit()
返回状态以便我可以调试?API似乎没有提到,测试让我相信这些方法实际上并没有返回值。因为这个,我觉得有点盲目——我应该调用一个方法,并祈祷有什么事情发生?
编辑:
出于沮丧,我刚刚使用print(update_product % data)
. 数据库接受它就好了。我还可以products
通过 python 用静态值更新表,但不能更新动态值。