我目前正在根据用户的输入构建 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 * 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 都会发生变化,这意味着我应该手动转义字符串。然而,当我搜索每个人都指向执行......
我对生成查询的方式也不太满意,所以如果有人有其他方法的想法,那就太好了!
您有两个选择:
切换到使用SQL炼金术 http://www.sqlalchemy.org/;它会让生成动态 SQL 变得更加Pythonicand确保正确引用。
-
由于您不能使用表名和列名的参数,因此您仍然必须使用字符串格式将它们包含在查询中。你的values另一方面,应该始终使用 SQL 参数,只要这样数据库就可以准备语句。
不建议只插入直接从用户输入中获取的表名和列名,这是far以这种方式注入任意 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)