【发布时间】:2018-02-06 22:36:53
【问题描述】:
我的目标是使用 mysql.connector 库将 JSON 对象存储到 json 类型的 MySQL 数据库字段中。
import mysql.connector
import json
jsonData = json.dumps(origin_of_jsonData)
cnx = mysql.connector.connect(**config_defined_elsewhere)
cursor = cnx.cursor()
cursor.execute('CREATE DATABASE dataBase')
cnx.database = 'dataBase'
cursor = cnx.cursor()
cursor.execute('CREATE TABLE table (id_field INT NOT NULL, json_data_field JSON NOT NULL, PRIMARY KEY (id_field))')
现在,下面的代码可以正常工作了,我的问题的重点是 '%s' 的使用:
insert_statement = "INSERT INTO table (id_field, json_data_field) VALUES (%s, %s)"
values_to_insert = (1, jsonData)
cursor.execute(insert_statement, values_to_insert)
我的问题是:在将变量 aValue(s) 组合成字符串时,我非常严格地坚持使用'...{}'.format(aValue)(或f'...{aValue}'),从而避免使用%s(无论我出于何种原因那个,我们不要在这里讨论它们 - 但这是我希望尽可能保留它的方式,因此我的问题)。
无论如何,无论我尝试哪种方式,我都无法使用类似于上述结构的东西创建将 jsonData 存储到 mySql 数据库中的东西,并使用'...{}'.format()(无论形状或形式)而不是@ 987654329@。例如,我(在许多迭代中)尝试过
insert_statement = "INSERT INTO table (id_field, json_data_field) VALUES ({}, {})".format(1, jsonData)
cursor.execute(insert_statement)
但是无论我怎么转和扭它,我都会收到以下错误:
ProgrammingError: 1064 (42000): 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“[some_content_from_jsonData})]”附近使用正确的语法
现在我的问题:
1) 有没有办法避免在这里使用我遗漏的 %s?
2) 如果不是,为什么?是什么让这成为不可能?是 cursor.execute() 函数,还是它是一个 JSON 对象,还是完全不同的东西? {}.format() 不应该能够做 %s 可以做的所有事情,甚至更多吗?
【问题讨论】:
-
您可能有兴趣阅读Python best practice and securest to connect to MySQL and execute queries。
"some string %s" % "other string"(注意%不是两个字符串之间的,)相当于"some string {}".format("other string"),你应该在查询中避免这两个 -
你应该使用
%s。这不是字符串替换的情况。它是 SQL 参数插入。它恰好使用了%s,所以看起来有点像%运算符。 -
您没有说明为什么要避免
%s,但这样做是明显错误,并且会使您面临SQL 注入的风险。你应该使用它。 -
您可以尝试使用字符串的
__repr__,这将(大部分时间但不是所有时间)将字符串放在单引号中,因此请使用:"INSERT INTO table (id_field, json_data_field) VALUES ({}, {!r})".format(1, jsonData)然而,这个结果是脆弱的。最好使用内置的SQL参数插入,确实有各种原因。 -
非常感谢您的回答!特别是解释(显式和隐式)这与字符串替换无关,但是恰好看起来像字符串替换的 SQL 参数插入是我正在寻找的信息......现在可能看起来是一个愚蠢的问题,但如果你刚刚开始,这些都是出现的问题类型 :) 再次感谢您!
标签: python json mysql-python string.format