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