在 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, 我在下面使用python
和Flask-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 条注意事项:
- 我建议你不要混用
filter
和filter_by
。
q.all()
执行查询并 returns 一个列表(或类似的东西)。如果您需要迭代结果,您只需 for i in q:...
。无需调用 all()
.
- 我怀疑您可能对
filter(or_(TestCodeName.code.contains(search)))
的作用有错误的认识。
- 你的不同对我来说没有意义。由于您按类型过滤,因此它始终只有一个值(Type_One 或 Type_Two),因此将其添加到 distinct 子句中没有多大意义,您只需要 distinct通过 TestCodeName.code,这意味着只需添加
distinct()
就足够了。
If TestDate >= '2021-01-01', filter type of Type_One
items, if TestDate < '2021-01-01' query type of Type_Two
items, 我在下面使用python
和Flask-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 条注意事项:
- 我建议你不要混用
filter
和filter_by
。 q.all()
执行查询并 returns 一个列表(或类似的东西)。如果您需要迭代结果,您只需for i in q:...
。无需调用all()
.- 我怀疑您可能对
filter(or_(TestCodeName.code.contains(search)))
的作用有错误的认识。 - 你的不同对我来说没有意义。由于您按类型过滤,因此它始终只有一个值(Type_One 或 Type_Two),因此将其添加到 distinct 子句中没有多大意义,您只需要 distinct通过 TestCodeName.code,这意味着只需添加
distinct()
就足够了。