动态表名的Python MySQL参数查询

动态表名的Python MySQL参数查询,python,mysql,mysql-python,Python,Mysql,Mysql Python,我想使用python程序查询MySQL表。但是,我要查询的表是那些名称作为变量(参数)传入的表 我试过这样的方法: readTable_query = """SELECT * FROM %s""" readTable_cursor.execute(readTable_query, (table_name)) 这方面的问题是,动态生成的SQL查询将表名放在引号中,也就是说,它不是生成“从产品中选择*”这样的查询,而是生成“从“产品”中选择*”这样的查询。这导致我的程序失败并抛出错误。有解决办法吗

我想使用python程序查询MySQL表。但是,我要查询的表是那些名称作为变量(参数)传入的表

我试过这样的方法:

readTable_query = """SELECT * FROM %s"""
readTable_cursor.execute(readTable_query, (table_name))
这方面的问题是,动态生成的SQL查询将表名放在引号中,也就是说,它不是生成“从产品中选择*”这样的查询,而是生成“从“产品”中选择*”这样的查询。这导致我的程序失败并抛出错误。有解决办法吗

我知道我可以连接查询,但这会导致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))
根据,有效的表名由以下字符组成。[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!')

一般来说,SQL参数化通常不允许参数化表(其思想是允许用户输入指定表是非常危险的,因此验证用户输入只是错误的安全性)。特别是,Python的SQL参数化是由DB-API2规范定义的,该规范不允许使用表名。更具体地说,MySQLdb确实允许这样做,但它没有文档记录,不应该被依赖。正确的答案通常是构建一个前端视图,让您选择具有列值的后端表,然后将其参数化。