Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 转义动态sqlite查询?_Python_Database_Sqlite_Escaping - Fatal编程技术网

Python 转义动态sqlite查询?

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

我目前正在根据用户的输入构建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每次都会更改,所以我不能在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和数据库抽象层。我经常同时在两个角色中使用库。一旦被收养,你就不会回去了-