SQL「LIKE」ステートメントと同等のSQLAlchemy


85

タグ列には、「アップルバナナオレンジ」や「ストロベリーバナナレモン」などの値があります。SQLAlchemyと同等のステートメントを見つけたい

SELECT * FROM table WHERE tags LIKE "%banana%";

これを行うには何を渡す必要Class.query.filter()がありますか?

回答:


172

各列にはlike()、で使用できるメソッドがありますquery.filter()。検索文字列を指定して、%両側に文字を追加して、両方向の部分文字列として検索します。

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

1
完璧!先行スペースを追加するよりも、リンゴとパイナップルを区別するためのより良い方法があるかどうか知っていますか?
Gary Oldfaber 2010

3
最善の方法は、データベースを正規化し、タグとタグとタスクの関係に2つの個別のテーブルを追加してから、LIKEの代わりにJOINを使用することです。そうでなければ、はい、文字列の各タグの周りに何らかの区切り文字が必要になるようです。%pen%のペンと鉛筆もあるため、先頭のスペースは十分ではありません。「| apple | pineapple | pen | pencil |」のようなことをすると 衝突してはならない「%| pen |%」と一致します。
ダニエルクルエフ2010

1
正規化では、特定のタスクに複数のタグを関​​連付ける方法、またはタグマップを使用してその逆を行う方法がよくわかりません。「Toxi」ソリューションは、タグのコレクションを個別に保存するのではなく、単一のアイテムとしてグループ化するように見えますか?また、このレシピ(elixir.ematia.de/trac/wiki/Recipes/TagCloud)で使用されている方法では、アイテムごとに1つのタグしか許可されていないようです。このトピックを解明するために最適なリソースは何ですか?私もこれ(dev.mysql.com/tech-resources/articles/…)を読みましたが、複数のタグを管理する方法を想像することはできません。
Gary Oldfaber 2010

2
私が言ったように、あなたは2つのテーブルが必要です。基本的には、そのちょうど典型的な多対多の関係は、あなたはそれにSQLAlchemyのガイドに従うことができるように:sqlalchemy.org/docs/... あなたは持っているでしょうtags、あなたがタグ名と他のタグ情報を格納するテーブルを、あなたは持っているだろうtask_tags、テーブルをどのタスクに追加されたタグごとに1つのレコードがあります。したがって、2つのタグを持つタスクでは、task_tagsテーブルに2つのレコードがあります。
ダニエルクルエフ2010

11

上記の答えに加えて、解決策を探す人は誰でも、「like」の代わりに「match」演算子を試すことができます。偏見を持ちたくないのですが、Postgresqlでは完全に機能しました。

Note.query.filter(Note.message.match("%somestr%")).all()

CONTAINSMATCHなどのデータベース関数を継承します。ただし、SQLiteでは使用できません。

詳細については、Common FilterOperatorsを参照してください。


8
これら2つの演算子の違いは何ですか?
buhtz 2016

@buhtzは、DBバックエンドによって異なります。SQL-Alchemyのドキュメントを参照してください:docs.sqlalchemy.org/en/14/core/…Postgresでは、postgresql.orgto_tsqueryORAND
ニック

7

このコードを試してください

output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))


0

ネイティブ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()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.