【问题标题】:Python SQL executemany statement doesn't workPython SQL executemany 语句不起作用
【发布时间】: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 行

【问题讨论】:

    标签: python mysql executemany


    【解决方案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)创建光标。如果这仍然没有帮助,我的想法已经不多了。
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多