我想使用我的python程序查询MySQL表。但是,我要查询的表是名称作为变量(参数)传入的表。
我试过这样的事情:
readTable_query = """SELECT * FROM %s"""
readTable_cursor.execute(readTable_query, (table_name))
这个问题是动态生成的SQL查询将表名放在引号中,即不生成类似" SELECT * FROM products"的查询,而是生成类似"的查询。 SELECT * FROM'产品'"。这导致我的程序失败并抛出错误。有解决方法吗?
我知道我可以连接查询,但这会导致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 :(得分:3)
根据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!')