SQLAlchemy с PostgresSQL и полнотекстовым поиском

Я использую колбу, sqlalchemy и колбу-sqlalchemy. Я хочу создать полный индекс поискового поиска в postgres с gin и to_tsvector. На данный момент я пытаюсь сделать следующее. Я думаю, что это самое близкое к тому, что я пытаюсь выразить, но не работает.

from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.schema import Index from sqlalchemy.sql.expression import func from app import db class Post(db.Model): id = db.Column(db.Integer, primary_key=True) added = db.Column(db.DateTime, nullable=False) pub_date = db.Column(db.DateTime, nullable=True) content = db.Column(db.Text) @declared_attr def __table_args__(cls): return (Index('idx_content', func.to_tsvector("english", "content"), postgresql_using="gin"), ) 

Это вызывает следующую ошибку …

 Traceback (most recent call last): File "./manage.py", line 5, in <module> from app import app, db File "/vagrant/app/__init__.py", line 36, in <module> from pep.models import * File "/vagrant/pep/models.py", line 8, in <module> class Post(db.Model): File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/flask_sqlalchemy.py", line 477, in __init__ DeclarativeMeta.__init__(self, name, bases, d) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/api.py", line 48, in __init__ _as_declarative(cls, classname, cls.__dict__) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 222, in _as_declarative **table_kw) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/schema.py", line 326, in __new__ table._init(name, metadata, *args, **kw) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/schema.py", line 393, in _init self._init_items(*args) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/schema.py", line 63, in _init_items item._set_parent_with_dispatch(self) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/events.py", line 235, in _set_parent_with_dispatch self._set_parent(parent) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/schema.py", line 2321, in _set_parent ColumnCollectionMixin._set_parent(self, table) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/schema.py", line 1978, in _set_parent self.columns.add(col) File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/sql/expression.py", line 2391, in add self[column.key] = column File "/home/vagrant/.virtualenvs/pep/local/lib/python2.7/site-packages/sqlalchemy/sql/expression.py", line 2211, in __getattr__ key) AttributeError: Neither 'Function' object nor 'Comparator' object has an attribute 'key' 

Я тоже пробовал

 return (Index('idx_content', "content", postgresql_using="gin"), ) 

Однако он не работает как postgres (по крайней мере, 9.1, поскольку это то, что я запускаю) ожидает, что to_tsvector будет вызван. Эта строка создает SQL;

 CREATE INDEX content_index ON post USING gin (content) 

а не то, что я хочу;

 CREATE INDEX content_index ON post USING gin(to_tsvector('english', content)) 

Я открыл билет, поскольку я думаю, что это может быть ошибка / ограничение. http://www.sqlalchemy.org/trac/ticket/2605

2 Solutions collect form web for “SQLAlchemy с PostgresSQL и полнотекстовым поиском”

На данный момент я добавил следующие строки, чтобы сделать это вручную, но я бы предпочел «правильный» подход SQLAlchemy, если он есть.

 create_index = DDL("CREATE INDEX idx_content ON pep USING gin(to_tsvector('english', content));") event.listen(Pep.__table__, 'after_create', create_index.execute_if(dialect='postgresql')) 

Была интересная дискуссия об отслеживании ошибок SQLAlchemy. Похоже, это ограничение текущего определения индексации. В основном, мое требование состоит в том, чтобы индексы были выражениями, а не только именами столбцов, но в настоящее время они не поддерживаются. Этот билет отслеживает этот запрос: http://www.sqlalchemy.org/trac/ticket/695 . Тем не менее, это ждет, когда разработчик продолжит работу и будет работать (и был на некоторое время).

Так в sqlalchemy 0.9 и выше это работает:

 class Content(Base, ): __tablename__ = 'content' id = sa.Column(sa.Integer, primary_key=True) description = sa.Column(sa.UnicodeText, nullable=False, server_default='') @declared_attr def __table_args__(cls): return (sa.Index('idx_content', sa.sql.func.to_tsvector("english", cls.description), postgresql_using="gin"), ) 

Примечательно, что отличие от первого примера является прямой ссылкой на имя столбца, в отличие от имени столбца, которое предоставляется в кавычках, поскольку это не сработало.

  • SQLAlchemy: добавить отношения, используя id вместо объекта?
  • python cx oracle ожидает строку, юникод или буферный объект
  • flask-sqlalchemy: модели импорта ошибочны
  • Как создать отношение многих ко многим в SQLAlchemy (python, flask) для модели User to itself
  • динамическое сопоставление sqlalchemy
  • Переопределение имени таблицы в Flask-Alchemy
  • Как упорядочить по количеству отношений «многие-ко-многим» в SQLAlchemy?
  • Связать объекты в отношениях «многие-ко-многим» в SQLAlchemy
  • Python - лучший язык программирования в мире.