使用 Python 创建 MariaDB 数据库

Create MariaDB database with Python

我想编写一个 python 脚本来创建新的 MariaDB 数据库。
数据库名称是用户输入的。我尝试使用参数创建数据库:

#!/usr/bin/python3
import mysql.connector

mariadb_host = '127.0.0.1'
mariadb_port = 3306
mariadb_user = 'root'
mariadb_password = 'password'

mariadb_connection = mysql.connector.connect(
    host=mariadb_host,
    port=mariadb_port,
    user=mariadb_user,
    passwd=mariadb_password,
    use_pure=True
)

query = 'CREATE DATABASE %(db_name)s;'
args = {'db_name': 'test-db'}

result = None
cursor = mariadb_connection.cursor()
cursor.execute(query, args)
print(cursor.statement)
result = cursor.fetchall()
cursor.close()

出现以下错误:mysql.connector.errors.ProgrammingError: 1064 (42000): 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 ''test-db'' at line 1
看起来,命令 cursor.execute 在数据库名称周围附加了 ',这导致无效的 sql 查询。

我怎样才能解决这个问题并根据用户输入安全地创建新数据库?

参数替换符号 - %(name)s%s 用于将 插入到 SQL 语句中。

RDBMS 对值和标识符(如数据库、table 或列名)有不同的引用规则。例如,一个字符串值将被单引号括起来,以告诉 RDBMS 这是一个字符值,但单引号标识符是一个语法错误; RDBMS 将要求使用其他字符(例如反引号、双引号、方括号,具体取决于 RDBMS)引用标识符。

如果您想使用 Python 插入 标识符 ,您必须使用字符串格式化技术。例如,使用 f-string

db_name = 'test-db'
query = f'CREATE DATABASE `{db_name}`;'

请注意,最好用反引号引用动态 identifier names 以处理包含特殊字符的名称。

与动态 SQL 生成一样,在处理来自不受信任来源的数据时,您应该意识到 SQL 注入的风险。