即使未提供参数,也可以使用基本查询

时间:2015-02-26 00:42:38

标签: python flask sqlalchemy flask-sqlalchemy

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

如果industry_idNone,我将收到此错误:

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

pagination = Company.query.filter((Company.industry_id == industry_id) & (Company.size == size)).paginate(
                page, per_page=current_app.config['POSTS_PER_PAGE'],
                error_out=False)

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

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
    ...

这很难维护,因为我有两个以上的选项,这意味着if和elses的许多组合。即使filter的元素是none,也可以使基本查询保持工作的任何替代方法

1 个答案:

答案 0 :(得分:1)

您不必在一行中构建整个查询。您可以随时随地构建它。

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()

filters = []
if size:
    filters.append(Company.size == size)
if industry_id:
    filters.append(Company.industry_id == industry_id)
result = Company.query.filter(*filters).all()

要进一步减少输入,取决于您获取值sizeindustry_id的方式,您可以使用列表推导。

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