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
  • Поиск набора в запросе SQLAlchemy
  • Как уловить ошибку 1062 «дублировать запись» независимо от используемой базы данных / движка?
  • SQLAlchemy декларативное свойство из join (отдельный атрибут, а не весь объект)
  • Как удалить все элементы из коллекции «многие ко многим» в SqlAlchemy?
  • Python: взаимодействие со сложным хранилищем данных
  • Массовые сберегательные объекты SQLAlchemy
  • Pylint не может найти элемент запроса SQLAlchemy
  • Как удалить строки из таблицы с помощью запроса SQLAlchemy без ORM?
  • Использование сеанса SQLAlchemy из Flask повышает «объекты SQLite, созданные в потоке, могут использоваться только в том же потоке»
  • Многие-ко-многим в sqlalchemy. Предотвращение вставки SQLAlchemy в таблицу, если тег уже существует
  • Python - лучший язык программирования в мире.