Python 转义动态sqlite查询?
我目前正在根据用户的输入构建SQL查询。这里可以看到一个如何实现这一点的示例:Python 转义动态sqlite查询?,python,database,sqlite,escaping,Python,Database,Sqlite,Escaping,我目前正在根据用户的输入构建SQL查询。这里可以看到一个如何实现这一点的示例: def generate_conditions(table_name,nameValues): sql = u"" for field in nameValues: sql += u" AND {0}.{1}='{2}'".format(table_name,field,nameValues[field]) return sql search_query = u"SELECT
def generate_conditions(table_name,nameValues):
sql = u""
for field in nameValues:
sql += u" AND {0}.{1}='{2}'".format(table_name,field,nameValues[field])
return sql
search_query = u"SELECT * FROM Enheter e LEFT OUTER JOIN Handelser h ON e.Id == h.Enhet WHERE 1=1"
if "Enhet" in args:
search_query += generate_conditions("e",args["Enhet"])
c.execute(search_query)
因为SQL每次都会更改,所以我不能在execute调用中插入值,这意味着我应该手动转义字符串。但是,当我搜索每个人要执行的点时
我对如何生成查询也不太满意,所以如果有人有其他方法的想法,那也太好了 您有两个选择:
改用;这将使生成动态SQL更具python风格,并确保正确引用
由于不能对表名和列名使用参数,因此仍必须使用字符串格式将这些参数包括在查询中。另一方面,您的值应该始终使用SQL参数,只要这样数据库才能准备语句
直接从用户输入中插入表名和列名是不可取的,这样插入任意SQL语句太容易了。根据您接受的此类名称列表验证表名和列名
因此,以您的示例为基础,我将朝以下方向发展:
tables = {
'e': ('unit1', 'unit2', ...), # tablename: tuple of column names
}
def generate_conditions(table_name, nameValues):
if table_name not in tables:
raise ValueError('No such table %r' % table_name)
sql = u""
params = []
for field in nameValues:
if field not in tables[table_name]:
raise ValueError('No such column %r' % field)
sql += u" AND {0}.{1}=?".format(table_name, field)
params.append(nameValues[field])
return sql, params
search_query = u"SELECT * FROM Enheter e LEFT OUTER JOIN Handelser h ON e.Id == h.Enhet WHERE 1=1"
search_params = []
if "Enhet" in args:
sql, params = generate_conditions("e",args["Enhet"])
search_query += sql
search_params.extend(params)
c.execute(search_query, search_params)
表名和列名是预先知道的吗?感谢您的回复,我将仔细了解SQLAlchemy,但是,由于这实际上是我唯一需要构建这种动态查询的时候,如果SQlAlchemy似乎有些过分,我可以选择第二种方法。@monoceres:SQlAlchemy除了动态SQL生成之外,还提供了ORM和数据库抽象层。我经常同时在两个角色中使用库。一旦被收养,你就不会回去了-