标签列具有“苹果香蕉橙”和“草莓香蕉柠檬”之类的值。我想找到等效的SQLAlchemy语句
SELECT * FROM table WHERE tags LIKE "%banana%";
我应该怎么Class.query.filter()
做才能做到这一点?
Answers:
每列都有一个like()
方法,可以在中使用query.filter()
。给定一个搜索字符串,请%
在任一侧添加一个字符以在两个方向上作为子字符串进行搜索。
tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()
tags
表,用于存储标记名称和其他标记信息,并且还将具有一个task_tags
表,其中对于添加到任务的每个标签,将有一条记录。因此带有2个标签的任务在task_tags
表中将只有2条记录。
除了上述答案外,无论谁在寻找解决方案,您都可以尝试使用“匹配”运算符而不是“喜欢”。不想被偏见,但它在Postgresql中对我来说非常有效。
Note.query.filter(Note.message.match("%somestr%")).all()
它继承了CONTAINS和MATCH之类的数据库功能。但是,它在SQLite中不可用。
有关更多信息,请转到通用过滤器运算符
to_tsquery
可以让你添加文字运营商喜欢的东西OR
和AND
postgresql.org/docs/current/...
如果您使用本机sql,则可以引用我的代码,否则就忽略我的答案。
SELECT * FROM table WHERE tags LIKE "%banana%";
from sqlalchemy import text
bar_tags = "banana"
# '%' attention to spaces
query_sql = """SELECT * FROM table WHERE tags LIKE '%' :bar_tags '%'"""
# db is sqlalchemy session object
tags_res_list = db.execute(text(query_sql), {"bar_tags": bar_tags}).fetchall()