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

最佳答案

如果您希望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')))

10-07 13:13