¿Hay alguna forma segura de parametrizar los nombres de bases de datos en las consultas de MySQL?

Estoy escribiendo un pequeño script de Python para ayudarme a automatizar la creación de bases de datos mysql y cuentas asociadas para mis proyectos personales. Parte de este script es una función que toma el nombre de la base de datos como una cadena y luego va a crear la base de datos.

def createDB(dbConn, dbName): import MySQLdb c = dbConn.cursor() query = """CREATE DATABASE %s;"""; c.execute(query, (dbName,)) 

Esto no funciona porque CREATE DATABASE de MySQL solicita el nombre no citado de la base de datos, como en

  CREATE DATAbASE test_db 

pero mi código que intenta insertar de forma segura el nombre db proporcionado por el usuario en la consulta crea:

  CREATE DATABASE 'test_db' 

Y obtienes “tienes un problema en tu syntax MySQL cerca de la prueba”.

Aunque esto es para uso personal, realmente no quiero simplemente insertar directamente una cadena proporcionada por el usuario en una consulta de ningún tipo. Es contra mi religión. ¿Existe una manera segura de insertar un nombre de base de datos provisto por el usuario en una consulta mySQL en python (o en cualquier idioma) que se asegure de que la entrada del usuario como test_db; DROP some_other_db; test_db; DROP some_other_db; ¿Será rechazado o escapado correctamente?

    Un nombre de base de datos (ni nombres de columna o tabla) no son valores de datos y, por lo tanto, no son un uso apropiado de los marcadores de posición. querer hacer esto suele ser una mala señal; solo el DBA debería poder emitir una create database , ya que hacerlo requiere algunos privilegios considerables. La mayoría de las aplicaciones requieren que el DBA emita la base de datos de creación y luego tome la base de datos creada como un parámetro para usar en los argumentos de dbapi.Connection.

    Si está seguro de que necesita esto, confía en la fuente de la entrada y ha revisado la entrada en busca de caracteres no válidos, simplemente haría la sustitución en python, algo como:

     def createDB(dbConn, dbName): c = dbConn.cursor() query = """CREATE DATABASE %s;""" % dbName c.execute(query) 

    Después de algunas excavaciones, resulta que phpmyadmin usa backticks para citar nombres de bases de datos, tablas y columnas. Simplemente hacen:

     $sql_query = 'CREATE DATABASE ' . PMA_backquote($new_db); 

    Lo que daría en el caso de error por encima de algo como

     CREATE DATABASE `test_db; DROP some_other_db`; 

    Por supuesto, cualquier backticks en la cadena de entrada debe escaparse, lo que de acuerdo con el código de phpmyadmin se realiza reemplazando todos los ticks de backback individuales con dobles ticks de respaldo. No puedo encontrar ningún lugar que confirme que esto es correcto.

    También noté en línea que los backticks no son SQL estándar.