【发布时间】:2010-07-24 14:31:14
【问题描述】:
标签列具有“苹果香蕉橙”和“草莓香蕉柠檬”等值。我想找到与 SQLAlchemy 等效的语句
SELECT * FROM table WHERE tags LIKE "%banana%";
我应该将什么传递给Class.query.filter() 来执行此操作?
【问题讨论】:
标签: python sqlalchemy
标签列具有“苹果香蕉橙”和“草莓香蕉柠檬”等值。我想找到与 SQLAlchemy 等效的语句
SELECT * FROM table WHERE tags LIKE "%banana%";
我应该将什么传递给Class.query.filter() 来执行此操作?
【问题讨论】:
标签: python sqlalchemy
每一列都有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 中不可用。
欲了解更多信息,请转到Common Filter Operators
【讨论】:
to_tsquery,它可以让您为 OR 和 AND postgresql.org/docs/current/… 等内容添加文本运算符
match 不完全支持部分字符串匹配(例如abc% 匹配abcd),而like 支持。
试试这个代码
output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))
【讨论】:
如果你想要不区分大小写的like子句实现:
session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()
【讨论】:
如果你使用原生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()
【讨论】:
LIKE '%' :bar_tags '%'syntax 吗?那是有线的。
使用 PostgreSQL like (see accepted answer above) 不知何故对我不起作用虽然案例匹配,但 ilike (case insensisitive like ) 会。
【讨论】:
ILIKE 是LIKE 的不区分大小写版本,因此您的输入仅在大小写时有所不同。
在 SQLAlchemy 1.4/2.0 中:
q = session.query(User).filter(User.name.like('e%'))
【讨论】: