在Python中,将JSON作为字符串插入mysql失败



我正在尝试使用Insert查询将一些数据更新到python中的mysql。如果我传入字符串,它工作正常,并更新数据库中的数据。然而,当我试图将JSON作为字符串添加到查询中时,它会给我带来语法错误。以下是我正在做的事情和输出。

check = process_quote(json_data)
# check returns a json.dumps(jsonVal) as a string
update_job_status(job_id, consts.COMPLETED_STATUS, check)

# update mysql table
def update_job_status(job_id, target_status, result):
c_mysql = create_mysql()
mysql_dict = {"request_result": target_status, "request_ID": job_id, "result": result}
c_mysql.insert_row(consts.MYSQL_TABLE, mysql_dict)
def insert_row(self, table_name, row_obj):
keys = row_obj.keys()
print("the Keys are : ")
print(keys)
values = map(lambda v: self.sql_quote_col(row_obj[v]), keys)
update_values = map(lambda v: "%s=VALUES(%s)" % (v, v), keys)
print(list(update_values))
sql = """INSERT IGNORE INTO {database_name}.{table_name} ({column_names}) VALUES ({column_values});""".format(database_name=consts.databaseNAME,table_name=table_name,column_names=", ".join(keys),column_values=", ".join(values))
# logging.debug(sql)
print(sql)
self.write_query(sql)

def sql_quote_col(self, val):
if type(val) is str:
return ""%s"" % val
elif val is None:
return "NULL"
else:
return "%s" % str(val)
def write_query(self, sql):
logging.info(sql)
self.writeDb = self.connect()
cursor = self.writeDb.cursor()
# try:
cursor.execute(sql)
# except:
#     logging.error("sql query execution fails: %s" % sql)
cursor.close()
self.writeDb.commit()
self.writeDb.close()

当我试图通过打印语句来识别查询时,我发现json元素一直有双"&"。查询看起来像:

INSERT IGNORE INTO databasename.tablename (request_result, request_ID, result) VALUES ("completed", "id_val", ""{"First Name":"value","Middle Initial":"E","Last Name":"Testing","value":"somevalue"}"");

我可以理解问题出在双引号上,但我无法确定为什么有两个引号加在同一个引号上。如有任何帮助/建议,我们将不胜感激。

谢谢

您当前的解决方案对SQL注入是开放的,解决这一问题也解决了您的格式问题。

如果您多次调用write_query,您可能希望重用该连接,而不是每次调用时都创建一个新连接。然而,只要使用您所拥有的,这就是如何更改write_query:

更改:

def write_query(self, sql, values):
self.writeDb = self.connect()
cursor = self.writeDb.cursor()
cursor.execute(sql, tuple(*values))
self.writeDb.commit()
self.writeDb.close()

你称之为

sql = """INSERT IGNORE INTO {database_name}.{table_name} ({column_names}) VALUES ({column_values});""".format(database_name=consts.databaseNAME, table_name=table_name, column_names=", ".join(keys), column_values=", ".join(['?' for __ in keys]))
self.write_query(sql, values)

注意,我不能真正测试我在这里写的东西,因为你没有提供一个最小的、可复制的例子,但我认为这里的想法应该很清楚。

一般来说,与其这样做:

sql = 'SELECT * FROM table WHERE field = "value"'
conn.execute(sql)

你应该这样做:

sql = 'SELECT * FROM table WHERE field = ?'
conn.execute(sql, (value,))

最新更新