【问题标题】:tsvector in sqlalchemysqlalchemy 中的 tsvector
【发布时间】:2012-11-30 00:01:14
【问题描述】:

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

【问题讨论】:

    标签: sqlalchemy tsvector


    【解决方案1】:

    如果您希望 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 像常规类型一样工作,您可以在表定义中使用它。 (我忘了我在哪里找到了 sn-p,可能在 SQLAlchemy 邮件列表或 wiki 上。)

    如果您需要实际解析 tsvector 数据,则要复杂一些。最新版本的 hstore 支持可能是一个很好的例子。但是,您可能会发现以下 sn-p 也很有用。这是已知可以工作的旧代码,是用 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')))
    

    【讨论】:

    • 非常感谢 jd,它工作得很好,事实上我到目前为止只对检索序列化查询感兴趣,顺便说一句,我怎么能在 sqlalchemy 中查询 tsvector 列(ts)?这适用于 postgresql:select * from boreholes_point_wgs84 where ts @@ to_tsquery('something');
    • 不客气。我添加了如何使用列生成 where 子句。如果有帮助,请考虑投票并接受答案:)
    • 再次感谢 jd,你的答案是赢家,你是最棒的 ;)
    • 我已经设法得到这样的东西,并在这里写了博客。我是linking to it,以防有人发现它有用。
    • 不客气@Gery。虽然它已在 SQLAlchemy 核心中被接受,但它主要仅用作教育工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2011-09-03
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多