Python SQL executemany 语句不起作用
Posted
技术标签:
【中文标题】Python SQL executemany 语句不起作用【英文标题】:Python SQL executemany statement doesn't work 【发布时间】:2021-02-28 10:16:10 【问题描述】:我正在尝试执行删除语句来检查表是否有任何 SKU 存在于数据框的 SKU 列中。如果是,它会删除该行。
supplier_name = input("Enter supplier name of the supplier you are updating: ")
df = pd.read_csv("update.csv",sep=',')
cursor = mydb.cursor()
column = df["SKU"]
print(column)
query="""DELETE FROM price_calculations1(Supplier_Name, SKU) VALUES(?,?)"""
cursor.executemany(query,(supplier_name, column))
mydb.commit()
cursor.close()
将代码改为;
cursor = mydb.cursor()
column = df["SKU"]
print(column)
query="""DELETE FROM price_calculations1 WHERE Supplier_Name=? AND SKU=?"""
cursor.executemany(query,(supplier_name, column))
mydb.commit()
cursor.close()
它给了我以下错误:
mysql.connector.errors.ProgrammingError: 1064 (42000): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '(Supplier_Name, SKU) VALUES(?,?)' 附近使用正确的语法 mysql.connector.errors.ProgrammingError: 1064 (42000): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '? 附近使用的正确语法。和 SKU=?在第 1 行
【问题讨论】:
【参考方案1】:这不是删除语句的正确语法。
您可以参考文档了解更多详情:https://dev.mysql.com/doc/refman/8.0/en/delete.html
正确的语法是:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
在你的情况下,你的陈述应该是这样的:
DELETE FROM price_calculations1
WHERE Supplier_Name=%s
AND SKU=%s
要使用参数化语句(也称为准备语句),您必须按如下方式创建光标:
cursor = mydb.cursor(prepared=True)
另请注意,executemany
需要一个可迭代的可迭代对象(或“序列或参数”),而 supplier_name
只是一个字符串,因此您也必须更改它。
文档中的 executemany 示例:
data = [
('Jane', date(2005, 2, 12)),
('Joe', date(2006, 5, 23)),
('John', date(2010, 10, 3)),
]
stmt = "INSERT INTO employees (first_name, hire_date) VALUES (%s, %s)"
cursor.executemany(stmt, data)
来源:https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html
【讨论】:
感谢第二部分,但即使在更改 DELETE 查询之后,我仍然遇到同样的错误。我之前也试过,不知道是不是忽略了一个小错误。 我不熟悉 mysql DB 连接器,但你有没有尝试用%s
替换 ?
? (例如WHERE Supplier_Name=%s ...
)
嗯,我只能猜测。根据this example,您应该使用cursor = connection.cursor(prepared=True)
(和使用%s
作为占位符)或在您的情况下使用cursor = mydb.cursor(prepared=True)
创建光标。如果这仍然没有帮助,我的想法已经不多了。以上是关于Python SQL executemany 语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章
python 在使用 Sql Server 的 fast_executemany 作为 TRUE 时崩溃
在 sql.executemany(... '(' 附近的语法错误
SQL executemany() 与 python 和一个数组和 ON DUPLICATE KEY