Запросы параметров Python MySQL для динамических имен таблиц


Я хочу запросить таблицы MySQL, используя мою программу python. Однако таблицы, которые я хочу запросить, - это те, имена которых передаются в качестве переменных (параметров).

Я попробовал что-то вроде этого:

readTable_query = """SELECT * FROM %s"""
readTable_cursor.execute(readTable_query, (table_name))

Проблема заключается в том, что динамически генерируемый SQL-запрос заключает имя таблицы в кавычки, то есть вместо того, чтобы генерировать запрос типа "SELECT * FROM products", он генерирует запрос типа "SELECT * FROM products". Это приводит к сбою моей программы и выбрасывает ошибки. Есть ли обходной путь?

Я знаю, что могу объединить запрос, но это приведет к риску безопасности SQL-инъекции.

Полный код для справки:

import MySQLdb

table_name = 'products'

db_connection = MySQLdb.connect(host,user,passwd,db)
readTable_cursor = db_connection.cursor() 
readTable_query = """SELECT * FROM %s"""
readTable_cursor.execute(readTable_query, (table_name))
1 2

1 ответ:

Согласно http://dev.mysql.com/doc/refman/5.0/en/identifiers.html , допустимые имена таблиц состоят из следующих символов. [0-9a-zA-Z_$] Итак, вам не составит труда написать свой собственный валидатор:

import re
table_name_validator = re.compile(r'^[0-9a-zA-Z_\$]+$')
if not table_name_validator.match(table_name):
    raise ValueError('Hey!  No SQL injecting allowed!')