sqlalchemy中的tsvector

Ger*_*ery 4 sqlalchemy tsvector

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

jd.*_*jd. 13

如果您希望SQLAlchemy能够使用tsvector类型创建模式并只检索查询中的序列化值,那么这就是您所需要的:

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

@compiles(tsvector, 'postgresql')
def compile_tsvector(element, compiler, **kw):
    return 'tsvector'
Run Code Online (Sandbox Code Playgroud)

tsvector像普通类型一样工作,您可以在表定义中使用它.(我忘记了在哪里找到了代码片段,可能在SQLAlchemy邮件列表或维基上.)

如果你需要实际解析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
Run Code Online (Sandbox Code Playgroud)

更新:

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

session.query(Model).filter(Model.tsvector.op('@@')(func.plainto_tsquery('search string')))
Run Code Online (Sandbox Code Playgroud)

  • 我已经设法得到这样的工作,并在这里写博客.我[连接到它](http://nibrahim.net.in/2013/11/29/sqlalchemy_and_full_text_searching_in_postgresql.html),以防有人发现它有用. (2认同)