动态表名的Python MySQL参数查询
我想使用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查询将表名放在引号中,也就是说,它不是生成“从产品中选择*”这样的查询,而是生成“从“产品”中选择*”这样的查询。这导致我的程序失败并抛出错误。有解决办法吗
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确实允许这样做,但它没有文档记录,不应该被依赖。正确的答案通常是构建一个前端视图,让您选择具有列值的后端表,然后将其参数化。