SQLAlchemy和Postgresql:to_tsquery()

时间:2012-03-01 20:48:33

标签: postgresql sqlalchemy

有没有人知道如何在sqlalchemy中使用postgresql的to_tsquery()函数?我在谷歌搜索了很多,我找不到任何我能理解的东西。请帮忙。

我希望它在过滤器功能中可用,如下所示:

session.query(TableName).filter(Table.column_name.to_tsquery(search_string)).all()

上述查询的预期SQL是这样的:

Select column_name
    from table_name t
    where t.column_name @@ to_tsquery(:search_string)

4 个答案:

答案 0 :(得分:8)

对于这些类型的任意查询,您可以将sql直接嵌入到查询中:

session.query(TableName).\
    filter("t.column_name @@ to_tsquery(:search_string)").\
    params(search_string=search_string).all()

您还应该能够参数化t.column_name,但目前无法查看相关文档。

答案 1 :(得分:6)

.op()方法允许您为任意运算符生成SQL。

session.query(TableName).filter(
    Table.c.column_name.op('@@')(to_tsquery(search_string))
).all()

答案 2 :(得分:0)

这可能是最近添加的,但值得作为更标准的解决方案添加。

query.filter(Model.attribute.match('your search string'))

为您做这件事,因为它会寻找适用于您方言的正确操作。

请参阅官方文档: https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#full-text-search

当然,这假定您要查询的表是使用to_tsvector属性构建的视图,该视图将对其应用@@操作。

答案 3 :(得分:0)

我 2021 年的五十美分,following the docs

之前的答案都没有提到如何将文本列转换为 postgres: to_tsvector('english', column)。我有一个索引为 tsvector 的文本列。这就是方法:

select(mytable.c.id).where(
        func.to_tsvector('english', mytable.c.title )\
        .match('somestring', postgresql_regconfig='english')
    )

就我而言,我不想将 to_tsquery 用作“.match”力。更直观的方法是在您有像 stackOverflow 这样的搜索输入时使用 websearch_to_tsquery。所以我做了一个来自jd response的混音。

我最终将其应用为 .filter() 以下语句:

func.to_tsvector('english', Table.column_name)\
    .op('@@')(func.websearch_to_tsquery("string to search",
    postgresql_regconfig='english'))

我认为这是通用公式,它也适用于 to_tsquery