Python MySQL参数查询动态表名

时间:2014-10-21 23:05:23

标签: python mysql mysql-python

我想使用我的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))

1 个答案:

答案 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!')