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

Python executemany 函数

使用pymysql插入语句时对execute与executemany两个方法进行测速

Python MySQL executemany的使用