我有一个数据库,我需要返回与查询匹配或看起来相似的任何值。
使用flask-sqlalchemy我可以手动过滤,但我无法使用列表推导式或任何其他更多 Pythonic 方法获取对象列表。
我已经尝试使用所有模型列(我有一个列表)和传递给filter_by查询的搜索值创建一个字典
column_dict_and_value = {column_name:'value' for column_name in columns}
a = model.query.filter_by(**column_dict_and_value).all()
Run Code Online (Sandbox Code Playgroud)
...但甚至不返回现有对象,虽然
a = model.query.filter_by(column_name='value').all()
Run Code Online (Sandbox Code Playgroud)
实际上返回对象。
我试过了filter(.like('%')),它有点工作
a = model.query.filter(model.column_name.like('valu%')).all()
Run Code Online (Sandbox Code Playgroud)
返回与该模式匹配但针对该列的所有对象的列表,我想遍历所有列。基本上是一个完整的搜索,因为我不确定用户要查找什么,如果查询存在于任何列中,我想显示对象,或者如果查询不完整,则显示对象列表,例如任何搜索中的 * .
我尝试使用列表推导来遍历模型属性,但显然不允许这样做:
a = [model.query.filter(model.column.like('valu%')) for column in columns]
Run Code Online (Sandbox Code Playgroud)
...这抱怨列不是模型的属性,由于语法原因,这是有道理的,但无论如何我都必须尝试,innit?
我是数据库和类对象的新手,所以请保持温和。我试图寻找类似的答案,但找不到适合我的答案。这filter_by(one_column, second_column, etc)在我看来不是很 Pythonic,如果出于任何原因我更改模型,我也需要更改查询,因为创建模型的 dict 理解在我看来更万无一失。
根据calestini建议的答案,我编写了这段似乎可以解决问题的代码。它还清理列表,因为如果all()没有任何结果(因为它在每个字段中查找)它返回 None 并添加到列表中。我宁愿它干净。
注意:我所有的字段都是文本。如果您的不同,请查看 calestini 提出的第三个解决方案。虽然没有测试过。
columns = [
"foo",
"bar",
"foobar"
]
def list_everything(search):
d = {column: search for column in columns}
raw …Run Code Online (Sandbox Code Playgroud)