Python 插入 JSON 对象时出现 pymysql 语法错误
Python pymysql syntax error while inserting a JSON object
在 Python 中使用的 SQL 数据库的 table 中插入时出现以下错误:
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'}
而 i 和 image_id 是两个整数(迭代的索引)。
以下是data_integrity_tooltable:
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。
您似乎没有指定要在 sql 查询中插入数据的字段名称。如果要插入 json 数据,也可以使用 blob 作为数据类型。很多 safer.Also 不要在插入查询中使用 no。
如果您考虑我的回答,那么您的 sql 陈述应该是这样的。
Table 创建命令:
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)
答案如下(首先,JSON对象没有问题):
创建table:
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))
注意:
- 在创建 table 中,我将 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)
在 Python 中使用的 SQL 数据库的 table 中插入时出现以下错误:
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'}
而 i 和 image_id 是两个整数(迭代的索引)。 以下是data_integrity_tooltable:
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。
您似乎没有指定要在 sql 查询中插入数据的字段名称。如果要插入 json 数据,也可以使用 blob 作为数据类型。很多 safer.Also 不要在插入查询中使用 no。
如果您考虑我的回答,那么您的 sql 陈述应该是这样的。 Table 创建命令:
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)
答案如下(首先,JSON对象没有问题):
创建table:
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))
注意:
- 在创建 table 中,我将 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)