Elixir/SQLAlchemy等同于SQL"LIKE"语句?

Gar*_*ber 72 python sqlalchemy

我正在使用这里描述的MySQLicious类型模式建立一个简单的标记系统.我已经在4个不同的SO线程中阅读了一些标记模式的替代实现,这最适合我的需求.

条目集合有标签"apple banana orange"和"strawberry banana lemon",我正在尝试找到Elixir/SQLAlchemy等效语句

SELECT * FROM table WHERE tags LIKE "%banana%";
Run Code Online (Sandbox Code Playgroud)

我无法找到任何这样的方法来构造Class.query.filter/filter_by()命令,并且无法在文档中看到任何模块的类似方法.有一个简单的方法吗?或者我应该只使用原始SQL.

额外问题:MySQLicious架构的一个缺点是我可能希望搜索"%apple%"但返回"菠萝".是否有高级方法来处理此测试用例?或者我应该在每个查询中包含一个前导空格?

nB:对于那些关心的人来说,这是我对数据库的第一次体验,所以我可能会忽略其他线程中提到的模式的核心优势.我的应用程序用于记录一个或两个关于已完成任务的句子,列[TaskID,Tags,Notes,StartTime,StopTime,TimeTaken],有点像简单的日记.主要用于教程目的.我希望能够通过单个标签进行搜索,以便大致了解我在给定任务上花费的时间.

Dan*_*uev 137

每列都有.like方法,可以用作过滤子句.

tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()
Run Code Online (Sandbox Code Playgroud)

  • 完美的!您知道是否有比添加前导空格更好的方法来区分苹果和菠萝吗? (2认同)
  • 最好的方法是标准化数据库并为标记和标记到任务关系添加2个单独的表,然后使用JOIN而不是LIKE.否则,是的,似乎你必须在字符串中的每个标签周围都有某种分隔符.领先的空间是不够的,因为还有钢笔和铅笔,%pen%.如果您执行"| apple | pineapple | pen | pencil |"之类的操作 并匹配"%| pen |%"它不应该碰撞. (2认同)
  • 正如我所说,你需要两张桌子.基本上,它只是典型的多对多关系,因此您可以按照SQLAlchemy的指南进行操作:http://www.sqlalchemy.org/docs/ormtutorial.html#building-a-many-to-many-relationship您将有`tags`表,你可以在其中存储标签名称和其他标签信息,你将拥有`task_tags`表,每个标签都有一条记录添加到任务中.所以带有2个标签的任务在`task_tags`表中只有2条记录. (2认同)

小智 15

如果您想要不区分大小写的 like 子句实现:

session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()
Run Code Online (Sandbox Code Playgroud)


igs*_*gsm 7

除了上面的答案,无论谁寻找解决方案,你也可以尝试'匹配'运算符而不是'喜欢'.不想有偏见但在Postgresql中它对我来说非常有用.

Note.query.filter(Note.message.match("%somestr%")).all()
Run Code Online (Sandbox Code Playgroud)

它继承了CONTAINSMATCH等数据库功能.但是,它在SQLite中不可用.

有关更多信息,请参阅Common Filter Operators

  • 这两个运营商有什么区别? (5认同)

war*_*a k 6

试试这段代码

output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))
Run Code Online (Sandbox Code Playgroud)