2013-12-14 28 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使用“%”,但对于Sqlite,如果您正在执行LIKE查询,则实际上要使用“*”(尽管对于ILIKE它是“%”,令人困惑)。

我要你使用SQLite,因为上面的查询失败,所以要回顾一下,使用SQLite如果你想区分大小写的部分字符串匹配猜测:Activity.name % "*Physics*",并且不区分大小写:Activity.name ** "%Physics%"

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

+0

谢谢。这确实很令人困惑。我正在使用SQLite进行开发,但我很可能会转而使用PostgreSQL进行开发,这意味着我将不得不改变它? – Ben

+0

是的,我可能需要添加一个像''db.wildcard''这样的属性,以便您的代码可以移植,当然您也可以将它添加到您自己的代码中。 – coleifer

+1

你可以使用''Activity.name.contains('Physics')''它应该做正确的事! – coleifer

17

你也可以使用these查询方法:.contains(substring).startswith(prefix).endswith(suffix)

例如,您的where子句可以是:

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

我相信这是不区分大小写和行为一样LIKE '%Physics%'

+1

这是最好的答案。 – coleifer

+0

这是一个更简单,更好的解决方案。请将其标记为已接受的答案。 – northernman