Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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 即使未提供参数,基本查询也可以工作_Python_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 即使未提供参数,基本查询也可以工作

Python 即使未提供参数,基本查询也可以工作,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个多参数搜索。其中一些是可选的。 在这个例子中,为了简单起见,我只使用了两个 如果industry\u id为None则我将出现以下错误: invalid input syntax for integer: "" LINE 3: WHERE companies_company.industry_id = '' 我的问题是,我需要有倍数,如果还有所有可能的组合?在这种情况下,过滤器应具有: if not size: Company.query.filter((Company.ind

我有一个多参数搜索。其中一些是可选的。 在这个例子中,为了简单起见,我只使用了两个

如果
industry\u id
None
则我将出现以下错误:

invalid input syntax for integer: ""
LINE 3: WHERE companies_company.industry_id = ''

我的问题是,我需要有倍数,如果还有所有可能的组合?在这种情况下,过滤器应具有:

if not size:
   Company.query.filter((Company.industry_id == industry_id
elif not industry_id:
   Company.query.filter((Company.size == size
else:
   Company.query.filter((Company.industry_id == industry_id & Company.size == size
    ...

这是可怕的维护,因为我有超过2个选项,这意味着许多组合的if和ELSE。即使筛选器元素为none,也可以使用任何其他方法保持基本查询正常工作?

您不必在一行中构建整个查询。你可以边做边建

query = Company.query
if size:
    query = query.filter(Company.size == size)
if industry_id:
    query = query.filter(Company.industry_id == industry_id)
result = query.all()
如果您觉得这太冗长,可以构建一个过滤器列表,然后将它们全部传递给
filter()

为了进一步减少键入,可以使用列表理解,具体取决于您获取值的方式
size
industry\u id

fields = ('size', 'industry_id')
filters = [getattr(Company, field) == request.form.get(field) for field in fields]
result = Company.query.filter(*filters).all()
filters = []
if size:
    filters.append(Company.size == size)
if industry_id:
    filters.append(Company.industry_id == industry_id)
result = Company.query.filter(*filters).all()
fields = ('size', 'industry_id')
filters = [getattr(Company, field) == request.form.get(field) for field in fields]
result = Company.query.filter(*filters).all()