2013-12-14 50 views
6

Peeweeで特定の部分文字列を含む結果をクエリに入力しようとしています。例えばPeeweeでの文字列の一致(SQL)

私は名前に「物理学」との活動だけしたい場合は、上記の例

schedule = Session.select().join(Activity).where(Activity.name % "%Physics%").join(Course).join(StuCouRel).join(Student).where(Student.id == current_user.id) 

をすべてのエラーを与えるものではありませんが、正常に動作しません。

pythonでは、私はちょうどif "Physics" in Activity.nameを実行するので、私はクエリで使用できる同等のものを探しています。

答えて

8

クイック答え:

ちょうどあなたが右の「ワイルドカード」を選択することをお勧めします使用しているデータベースバックエンドによってはActivity.name.contains('Physics')


を使用しています。 PostgresqlとMySQLは "%"を使用しますが、LIKEクエリを実行している場合はSqliteに対して "*"を使用します(ILIKEでは "%"ですが、混乱します)。

上記のクエリが失敗しているので、大文字と小文字を区別する部分文字列のマッチングが必要な場合は、SQLiteを使って説明します。、大文字小文字を区別しない場合はActivity.name ** "%Physics%"です。 .contains(substring).startswith(prefix).endswith(suffix)

http://www.sqlite.org/lang_expr.html#like

+0

ありがとうございました。それは確かに非常に混乱しています。私は開発用にSQLiteを使っていましたが、PostgreSQLに切り替える可能性が高いので、変更する必要があります。 – Ben

+0

ええ、 '' db.wildcard''のような属性を追加する必要があるかもしれませんので、あなたのコードは移植可能になりますが、あなた自身のコードにも追加できます。 – coleifer

+1

'' Activity.name.contains( 'Physics') ''を使うことができます。それは正しいことです! – coleifer

17

またtheseクエリーメソッドを使用することができます。例えば

、あなたのwhere句は次のようになります。

.where(Activity.name.contains("Physics")) 

私は、これは、大文字と小文字を区別しないで、LIKE '%Physics%'と同じ動作をしますと信じています。

+1

これは最高の答えです。 – coleifer

+0

これはより簡単で優れたソリューションです。 Accepted answerとしてマークしてください。 – northernman