Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python和MySQL中使用参数化查询_Python_Mysql_Python 3.x - Fatal编程技术网

在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

我正在使用Python+MySQL,希望使用参数化查询。我卡住了。我遇到了一个错误,不知道如何解决它。我花了一天时间,查阅了几十篇文章,使用了各种选项(单引号、双引号、准备好的声明),但仍然没有运气

要求:使用参数化查询

以下是该问题的基本演示:

#!/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+)。。。有趣的是,我没有意识到这一点。很高兴知道。也许我在文档中遗漏了它。谢谢比尔和冻糕!