Создать индекс возвращает откат транзакции

Сеанс SqlAlchemy был определен как:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

и было настроено:

DBSession.configure(bind=engine)
Base.metadata.bind = engine

И нужно создать индекс для поля jsonb, используя выполнение необработанного sql в транзакции:

with transaction.manager:
    sql = "CREATE INDEX my_index ON my_table USING gin ((jsonb_field -> 'jsonb_key'));"
    DBSession.execute(sql)

Журнал SqlAlchemy для операции выглядит так:

BEGIN (implicit)
INFO CREATE INDEX my_index ON my_table USING gin ((jsonb_field -> 'jsonb_key'));
INFO  {}
INFO  ROLLBACK

И индекс не создается.

Но та же команда SQL в psql создает индекс без ошибок:

=> CREATE INDEX my_index ON my_table USING gin ((jsonb_field -> 'jsonb_key'));
=> CREATE INDEX

Как в этом случае создать индекс с помощью команды «выполнить» SqlAlchemy?


person karavanjo    schedule 19.05.2015    source источник
comment
Это всего лишь обоснованное предположение, но действительно ли оставление контекста транзакции подразумевает фиксацию? Может быть, вам нужно вызвать явный коммит там? Потому что мне кажется, что CREATE INDEX действительно выполняется, но затем откат удаляет индекс.   -  person deets    schedule 19.05.2015
comment
Да, выход из контекста транзакции действительно подразумевает фиксацию. И я попытался сделать это, явно используя transaction.begin() и transaction.commit() - тот же результат.   -  person karavanjo    schedule 19.05.2015
comment
Я бы по-прежнему с подозрением относился к менеджеру транзакций Zope. Но если вы нашли решение — молодец.   -  person deets    schedule 20.05.2015


Ответы (1)


Нашел одно "жесткое" решение. Если сделать это без использования механизма транзакций и сеансов:

DBSession.bind.engine.execute(sql)

и журнал SqlAlchemy:

INFO CREATE INDEX my_index ON my_table USING gin ((jsonb_field -> 'jsonb_key'));
INFO {}
INFO COMMIT

и индексы были созданы в базе данных - я проверял с помощью psql.

person karavanjo    schedule 19.05.2015