以编程方式生成sql炼金术?

时间:2014-06-27 15:58:24

标签: sqlalchemy

我有一个包含3个输入字段的输入表单。用户可以选择填充1到3个输入字段。我正在根据他们的输入生成SQL炼金术查询。如果用户尚未填写字段,则它不应该是查询条件的一部分。

我想我可以编写带有7个分支的代码 - 每个可能的查询都有一个SQL炼金术查询(例如,如果用户填写了字段2和3但不填写1,那么查询看起来像这样......)。 / p>

但我认为有一种方法可以以编程方式生成SQL炼金术语句,以避免这种复杂的分支。有这样的方法吗?

1 个答案:

答案 0 :(得分:0)

只需按需链接过滤器并避免完全分支:

q = session.query(Person) # .join(...).filter(...).order_by(...)

# optional filters
if form.filter_name:
    q = q.filter(Person.name == form.filter_name)
if form.filter_minimum_age:
    q = q.filter(Person.minimum_age >= form.minimum_age)
if form.tag_name:
    q = q.join(Tag, Person.tags).filter(Tag.name.like('%' + form.tag_name + '%'))

# iterate over results (only now the DB will be queried)
for person in q.all():
    # do whatever