在Python和MySQL中使用参数化查询
我正在使用Python+MySQL,希望使用参数化查询。我卡住了。我遇到了一个错误,不知道如何解决它。我花了一天时间,查阅了几十篇文章,使用了各种选项(单引号、双引号、准备好的声明),但仍然没有运气 要求:使用参数化查询 以下是该问题的基本演示:在Python和MySQL中使用参数化查询,python,mysql,python-3.x,Python,Mysql,Python 3.x,我正在使用Python+MySQL,希望使用参数化查询。我卡住了。我遇到了一个错误,不知道如何解决它。我花了一天时间,查阅了几十篇文章,使用了各种选项(单引号、双引号、准备好的声明),但仍然没有运气 要求:使用参数化查询 以下是该问题的基本演示: #!/usr/bin/python3 import mysql.connector as mysql conn = mysql.connect(host=server, user=username, passwd=password, autocomm
#!/usr/bin/python3
import mysql.connector as mysql
conn = mysql.connect(host=server, user=username, passwd=password, autocommit=True)
try:
create_database_query = "CREATE DATABASE %s;"
db_name = "BOOKS"
cursor = conn.cursor()
print(f"Creating {db_name} database... ", end='')
cursor.execute(create_database_query, (db_name,))
print("Success")
except mysql.Error as error:
print("Parameterized query failed {}".format(error))
输出:
正在创建图书数据库。。。参数化查询失败1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“BOOKS”附近使用的正确语法
所以看起来它使用了太多的引号(每边两个单引号)。如果我更改以下行,上面的代码可以正常工作:
create\u database\u query=“创建数据库%s;”
并在%s周围加上反勾号
问题是,现在它创建了一个数据库,但具有无效的字符--“BOOKS”(引号现在是db name的一部分)。嗯
如果我使用准备好的语句,则会出现相同的问题,但错误消息略有不同:
1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“?”附近使用的正确语法
环境:
- 卡塔利纳马科斯酒店
- Python 3.8
- py3.3集成开发环境
- MySQL 8.0.19
- mysql连接器python模块8.0.19
谢谢您不能将查询参数用于标识符(如数据库名、表名或列名) 查询参数只能用于替换常量值—带引号的字符串、带引号的日期/时间或数值。不是标识符、表达式、SQL关键字等 要将数据库名称与CREATEDATABASE语句相结合,必须在将其发送到MySQL之前将其格式化为字符串,以形成完整语句
db_name = "BOOKS"
create_database_query = "CREATE DATABASE %s;" % db_name
cursor.execute(create_database_query)
因为在将变量格式化到字符串中时会产生SQL注入的风险,所以由您来确保db\u name
是安全的
更新:感谢@Parfait提醒我们当前字符串格式的最佳实践 首选:
db_name = "BOOKS"
create_database_query = "CREATE DATABASE {};".format(db_name)
或F字符串:
db_name = "BOOKS"
create_database_query = f"CREATE DATABASE {db_name};"
(换句话说,Python已经变成了Ruby;-)我知道你不是Pythoner,而是模运算符,
%
,因为字符串插值是用Python编写的。建议使用str.format
(Python2.6+)或OP使用的F字符串(Python3.6+)。。。有趣的是,我没有意识到这一点。很高兴知道。也许我在文档中遗漏了它。谢谢比尔和冻糕!