在 db.session.query.filter_by() 时如何使用 case?需要优化Python/Flask-SQLAlchemy

How to use case wen in db.session.query.filter_by()? Need to be optimized Python/Flask-SQLAlchemy

If TestDate >= '2021-01-01', filter type of Type_One items, if TestDate < '2021-01-01' query type of Type_Two items, 我在下面使用pythonFlask-SQLAlchemy实现了,但是很丑,请问下面的代码如何优化?

somewords = args.get('somewords')
search = "%{}%".format(somewords)
TestDate = db.session.query(TestProject.test_date).filter(TestProject.id==id).first()

if TestDate >= '2021-01-01':
    test_code = db.session.query(TestCodeName.code). \
    distinct(TestCodeName.code, TestCodeName.type). \
    filter_by(type='Type_One'). \
    filter(or_(TestCodeName.code.contains(search))).all()
else:
    test_code = db.session.query(TestCodeName.code). \
    distinct(TestCodeName.code, TestCodeName.type). \
    filter_by(type='Type_Two'). \
    filter(or_(TestCodeName.code.contains(search))).all()

您可以在第一步构建查询并在另一步添加条件,如下所示:

q = db.session.query(TestCodeName.code). \
    distinct(TestCodeName.code, TestCodeName.type). \
    filter(or_(TestCodeName.code.contains(search)))

if TestDate >= '2021-01-01':
    q = test_code.filter(type == 'Type_One')
else:
    q = test_code.filter(type == 'Type_Two')

test_code = q.all()

4 条注意事项:

  • 我建议你不要混用filterfilter_by
  • q.all() 执行查询并 returns 一个列表(或类似的东西)。如果您需要迭代结果,您只需 for i in q:...。无需调用 all().
  • 我怀疑您可能对 filter(or_(TestCodeName.code.contains(search))) 的作用有错误的认识。
  • 你的不同对我来说没有意义。由于您按类型过滤,因此它始终只有一个值(Type_One 或 Type_Two),因此将其添加到 distinct 子句中没有多大意义,您只需要 distinct通过 TestCodeName.code,这意味着只需添加 distinct() 就足够了。