7

私は sqlalchemy で tsvector を使用する方法を探していました (単に INTEGER などの他のものと同様に) が、これまでのところ、これを行う方法が明確ではありません。UserDefinedTypeを使用して tsvector を型として実装できることを読みました。いくつかの試みの後、私はどこにも行きません。誰かがこれを行う簡単な方法を持っていますか? ありがとう

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 に答える