7

我一直在寻找一种在 sqlalchemy 中使用 tsvector 的方法(就像 INTEGER 等其他方法一样),但到目前为止我还不清楚如何做到这一点。我读过 tsvector 可以使用UserDefinedType实现为类型。经过一些尝试,我一无所获,有人有一个简单的方法来做到这一点吗?谢谢

4

1 回答 1

18

如果您希望 SQLAlchemy 能够创建具有 tsvector 类型的模式并仅在查询中检索序列化值,这就是您所需要的:

from sqlalchemy import types
class tsvector(types.TypeDecorator):
    impl = types.UnicodeText

@compiles(tsvector, 'postgresql')
def compile_tsvector(element, compiler, **kw):
    return 'tsvector'

tsvector像常规类型一样工作,您可以在表定义中使用它。(我忘记了我在哪里找到的片段,可能是在 SQLAlchemy 邮件列表或 wiki 上。)

如果你需要实际解析 tsvector 数据,那就稍微复杂一点。最新版本的 hstore 支持可能是一个很好的例子。但是,您可能会发现以下代码段也很有用。这是已知可以工作的旧代码,并且是用 pyparsing 编写的:

from pyparsing import ParserElement, QuotedString, Regex, Group, Suppress, Group, delimitedList, ZeroOrMore, StringEnd
ParserElement.enablePackrat()
lexeme = QuotedString("'")
occurrence_marker = Regex('[1-9][0-9]*[A-D]?')
atom = Group(lexeme('lexeme') + Suppress(':') + Group(delimitedList(occurrence_marker))('markers'))('atom')
tsvector = ZeroOrMore(atom) + StringEnd()
parse_tsvector = tsvector.parseString

更新:

要查询 tsvector 列,请使用如下.op()方法:

session.query(Model).filter(Model.tsvector.op('@@')(func.plainto_tsquery('search string')))
于 2012-12-14T12:45:17.193 回答