插入 JSON 对象时出现 Python pymysql 语法错误

Posted

技术标签:

【中文标题】插入 JSON 对象时出现 Python pymysql 语法错误【英文标题】:Python pymysql syntax error while inserting a JSON object 【发布时间】:2017-08-29 08:35:40 【问题描述】:

在插入 Python 中使用的 SQL 数据库的表时出现以下错误:

pymysql.err.ProgrammingError: (1064, 'You have an error in your SQL 
syntax; check the manual that corresponds to your MariaDB server 
version for the right syntax to use near \'"Black": "b": "125.98", 
"a": "126.796", "L": "117.245", "Pink": "b": "130.286\' at line 1')

SQL 命令是:

json1 = json.dumps(meanLAB_vals_dict) # convert python dict to json string 
json2 = json.dumps(deltaE_dict)
sql_command = """INSERT INTO data_integrity_tool VALUES (%d, %d, %s, %s)""" %(i, image_id, json1, json2)

cursor.execute(sql_command)
connection.commit()

meanLAB_vals_dict 是:

'Black': 'b': '125.98', 'a': '126.796', 'L': '117.245', 'Pink': 
'b': '130.286', 'a': '180.918', 'L': '169.0', 'Green': 'b': 
'135.531', 'a': '103.51', 'L': '144.755', 'Violet': 'b': '109.878',
'a': '136.653', 'L': '122.02', 'Grey': 'b': '123.327', 'a': 
'125.612', 'L': '139.429', 'Yellow': 'b': '195.571', 'a': 
'112.612', 'L': '234.694', 'Red': 'b': '153.449', 'a': '177.918',
'L': '163.939', 'White': 'b': '128.02', 'a': '128.939', 'L': 
'243.878', 'Blue': 'b': '84.7551', 'a': '122.98', 'L': '163.673'

deltaE_dict 是:

'Black': '38.5187', 'Pink': '38.6975', 'mean delta E': '28.0643', 
'Green': '42.6365', 'Violet': '35.5018', 'Grey': '19.8903', 'Yellow':
'24.5115', 'Red': '40.0078', 'White': '4.4993', 'Blue': '8.31544'

iimage_id 是两个整数(迭代的索引)。 以下是 data_integrity_tool 表:

sql_command = """CREATE TABLE IF NOT EXISTS data_integrity_tool (
                 id_              INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,  
                 image_id         INTEGER NOT NULL,
                 mean_lab_values  TEXT,
                 delta_e_values   TEXT);"""

我知道已经存在一些类似的问题,但是,它们是针对 PHP 的,我对此一无所知,而且我是 SQL 的新手。

【问题讨论】:

字段名称/列是可选的。但是,我可以尝试一下。而且,结果是同样的错误。此外,与blob。错误仍然存​​在。 您在整数列 id_image_id 中传递字符串值。 id_ 也是自动增量。 @SatishGarg:我做了这些改变。但是,错误仍然存​​在。似乎 json 对象中有一些东西。但是,当我将 python 字典转储到 json 对象中时,我没有收到任何错误。 你能发布你的查询部分吗? 是的,查询已经在问题的开头部分:sql_command = """INSERT INTO data_integrity_tool(id_, image_id, mean_lab_values, delta_e_values) VALUES (%d, %d, %s, % s)""" %(i, image_id, json1, json2) 【参考方案1】:

您似乎没有指定要在 sql 查询中插入数据的字段名称。如果要插入 json 数据,也可以使用 blob 作为数据类型。这样更安全。也不要在插入查询中强制输入 no。

如果您考虑我的回答,那么您的 sql 语句应该是这样的。 建表命令:

sql_command = """CREATE TABLE IF NOT EXISTS data_integrity_tool ( id_ INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, image_id INTEGER NOT NULL, mean_lab_values BLOB, delta_e_values BLOB);"""

插入命令:

sql_command = """INSERT INTO data_integrity_tool(id_,image_id,mean_lab_values,delta_e_values) VALUES (%d, %d, %s, %s)""" %(i, image_id, json1, json2)

【讨论】:

始终对所有字段使用“%s”。检查这些链接: - ***.com/questions/5785154/… - mysql-python.sourceforge.net/MySQLdb.html#some-examples【参考方案2】:

这是答案(首先,JSON对象没有问题):

    创建表:

    sql_command = """CREATE TABLE IF NOT EXISTS data_integrity_tool (
                 id_              INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,  
                 image_id         INTEGER NOT NULL,
                 mean_lab_values  TEXT COLLATE utf8_unicode_ci,
                 delta_e_values   TEXT COLLATE utf8_unicode_ci);"""
    

    SQL 插入查询:

    json1 = json.dumps(meanLAB_vals_dict)
    json2 = json.dumps(deltaE_dict)
    
    sql_command = """INSERT INTO data_integrity_tool(id_, image_id,  
    mean_lab_values, delta_e_values) VALUES (%s, %s, %s, %s)""" 
    
    cursor.execute(sql_command, (i, image_id, json1, json2))
    

注意:

在创建表中,我将 COLLATE 添加到 utf8_unicode_ci。如果你没有提到,默认是 latin1_swedish_ci 我不需要。 在 SQL 插入查询中,sql_command 不包含值,而是在执行函数期间提供。这避免了SQL Injection。 另外,在 SQL 插入查询中,始终对所有字段使用 %s

有趣的链接:

Insert Python List (JSON or otherwise) into MySQL databse Inserting JSON into MySQL using Python Python/MySQL query error: `Unknown column` Python MySQLdb issues (TypeError: %d format: a number is required, not str)

【讨论】:

以上是关于插入 JSON 对象时出现 Python pymysql 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

(Django) 安装夹具“rules.json”时出现问题:“NoneType”对象没有属性“id”

Failed: error processing document #281: unexpected EOF,往MongoDB当中插入json文件时出现的错误。

在python中使用for循环时出现JSONDecodeError [重复]

Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释

解析 JSON 对象时出现 NoClassDefFoundError JsonAutoDetect

将 JSON 导入 Google BigQuery 时出现重复对象的问题