0

SqlAlchemy 会话被定义为:

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

并被配置:

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

并且需要使用在事务中执行原始 sql 为 jsonb 字段创建索引:

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“执行”命令创建索引?

4

1 回答 1

0

找到了一个“硬”的解决方案。如果在不使用事务和会话机制的情况下这样做:

DBSession.bind.engine.execute(sql)

和 SqlAlchemy 日志:

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

并且索引已创建到数据库中 - 我已经使用psql.

于 2015-05-19T15:25:23.893 回答