Python,MySql ON 重复键语法错误

Posted

技术标签:

【中文标题】Python,MySql ON 重复键语法错误【英文标题】:Python, MySql ON Duplicate Key Syntax Error 【发布时间】:2021-02-06 06:29:16 【问题描述】:

全部,

我正在使用 mysql.connector 从我的 python 代码中连接和执行数据库操作。我在添加 ON DUPLICATE KEY UPDATE 查询的那一刻开始收到以下错误。

无法插入 MySQL 表 1064 (42000): 你有一个错误 你的 SQL 语法;检查与您的 MySQL 对应的手册 服务器版本,以便在 ''' 附近使用正确的语法), Assigned_to=values(''), Assignment_group=values('更新'), Company=values(' 在第 1 行

执行该操作的我的代码是

mycursor = connection.cursor()
                sql = "INSERT INTO server(Asset_tag,Assigned_to,Assignment_group,Company,CPU_core_count,CPU_count,CPU_manufacturer,CPU_speed,CPU_type,Diskspace,DNS_Domain,Manufacturer,Name,Operating_System,OS_Domain,OS_Service_Pack,OS_Version,RAM,Serial_number,Description) VALUES (%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s) \
                ON DUPLICATE KEY \
                UPDATE  Asset_tag=values(%s), Assigned_to=values(%s), Assignment_group=values(%s), Company=values(%s), Serial_number=values(%s)"
                val = (
                    data[0]["Asset tag"],
                    data[0]["Assigned to"],
                    "Temp",
                    data[0]["Company"],
                    data[0]["CPU core count"],
                    data[0]["CPU count"],
                    data[0]["CPU manufacturer"],
                    data[0]["CPU speed (MHz)"],
                    data[0]["CPU type"],
                    data[0]["Disk space (GB)"],
                    data[0]["DNS Domain"],
                    data[0]["Manufacturer"],
                    data[0]["Name"],
                    data[0]["Operating System"],
                    data[0]["OS Domain"],
                    data[0]["OS Service Pack"],
                    data[0]["OS Version"],
                    data[0]["RAM (MB)"],
                    data[0]["Serial number"],
                    data[0]["Description"],
                    data[0]["Asset tag"],
                    data[0]["Assigned to"],
                    "Updated",
                    data[0]["Company"],
                    data[0]["Serial number"],
                )
                print(val)
                mycursor.execute(sql, (val))
                connection.commit()

更新:

下面的也行不通

sql = "INSERT INTO server(Asset_tag,Assigned_to,Assignment_group,Company,CPU_core_count,CPU_count,CPU_manufacturer,CPU_speed,CPU_type,Diskspace,DNS_Domain,Manufacturer,Name,Operating_System,OS_Domain,OS_Service_Pack,OS_Version,RAM,Serial_number,Description) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) \
                ON DUPLICATE KEY \
                UPDATE  Asset_tag=VALUES(%s), Assigned_to=VALUES(%s), Assignment_group=VALUES(%s), Company=VALUES(%s), Serial_number=VALUES(%s)"

参考了这些链接但没有帮助:

https://topherpedersen.blog/2019/12/10/how-to-use-on-duplicate-key-update-with-python-mysql-and-mysql-connector/

MySQL Python ON DUPLICATE KEY UPDATE VALUES

【问题讨论】:

您是否尝试过在 SQL 查询中使用带多个引号的多行字符串,而不是一个引号和反斜杠?类似""" query string """ 【参考方案1】:

在 sql 中试试这个:

sql = "INSERT INTO server(Asset_tag,Assigned_to,Assignment_group,Company,CPU_core_count,CPU_count,CPU_manufacturer,CPU_speed,CPU_type,Diskspace,DNS_Domain,Manufacturer,Name,Operating_System,OS_Domain,OS_Service_Pack,OS_Version,RAM,Serial_number,Description) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) \
            ON DUPLICATE KEY \
            UPDATE  Asset_tag=VALUES(Asset_tag), Assigned_to=VALUES(Assigned_to), Assignment_group=VALUES(Assignment_group), Company=VALUES(Company), Serial_number=VALUES(Serial_number);"

注意:删除您在 val 中发送的额外键,或者您可以跳过使用 VALUES(col_name) 并直接分配值。

请参阅此处以正确使用 ON DUPLICATE KEY:https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

在 ON DUPLICATE KEY UPDATE 子句的赋值表达式中,可以使用 VALUES(col_name)

【讨论】:

【参考方案2】:

值占位符也需要用逗号分隔,而不仅仅是空格。

【讨论】:

我也厌倦了逗号但没用【参考方案3】:

VALUES 函数在 ON DUPLICATE KEY UPDATE 中的使用方式存在问题。这是来自文档的 sn-p 解释。

在 ON DUPLICATE KEY UPDATE 子句中的赋值表达式中,您可以使用 VALUES(col_name) 函数来引用来自 INSERT ... ON DUPLICATE KEY UPDATE 语句的 INSERT 部分的列值。换句话说,ON DUPLICATE KEY UPDATE 子句中的 VALUES(col_name) 是指将插入的 col_name 的值,没有发生重复键冲突。这个函数在多行插入中特别有用。

Link to documentation

解决方案:

    我们可以避免使用 VALUES 函数并直接更新值如下:

     sql = "INSERT INTO server(Asset_tag,Assigned_to,Assignment_group,Company,CPU_core_count,CPU_count,CPU_manufacturer,CPU_speed,CPU_type,Diskspace,DNS_Domain,Manufacturer,Name,Operating_System,OS_Domain,OS_Service_Pack,OS_Version,RAM,Serial_number,Description) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) \
             ON DUPLICATE KEY \
             UPDATE  Asset_tag=%s, Assigned_to=%s, Assignment_group=%s, Company=%s, Serial_number=%s"
    

    从插入语句中传递确切的字段名称,如下所示:

     sql = "INSERT INTO server(Asset_tag,Assigned_to,Assignment_group,Company,CPU_core_count,CPU_count,CPU_manufacturer,CPU_speed,CPU_type,Diskspace,DNS_Domain,Manufacturer,Name,Operating_System,OS_Domain,OS_Service_Pack,OS_Version,RAM,Serial_number,Description) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) \
             ON DUPLICATE KEY \
             UPDATE  Asset_tag=VALUES(Asset_tag), Assigned_to=VALUES(Assigned_to), Assignment_group=%s, Company=VALUES(Company), Serial_number=VALUES(Serial_number)"
    

【讨论】:

以上是关于Python,MySql ON 重复键语法错误的主要内容,如果未能解决你的问题,请参考以下文章

深入mysql "ON DUPLICATE KEY UPDATE" 语法的分析

SQL 语法错误:第 1 行的“FROM table_A INNER JOIN table_B ON table_A.name = table_B.name”[重复]

Python字典函数在Linux上导致语法错误,但在Windows上没有[重复]

学习python3 MySQL数据库语法遇到的问题:"Can't connect to MySQL server on 'localhost'

jsqlparser:修改语法定义(JSqlParserCC.jjt)实现UPSERT支持Phoenix语法ON DUPLICATE KEY IGNORE

jsqlparser:修改语法定义(JSqlParserCC.jjt)实现UPSERT支持Phoenix语法ON DUPLICATE KEY IGNORE