SQLAlchemy:声明式ORM - 使用GIST和TSRANGE构建索引

3

我想建立一个类似于SQL中这样的索引:

CREATE INDEX IF NOT EXISTS new_index ON schema.tablename USING gist (tsrange(start, "end"))

我的声明式ORM模型大致如下:

import sqlalchemy as sa

class Tablename(Mixins):

    __table_args__ = (
        sa.Index('index_name', postgresql_using="gist"),  # ????
        {'schema': 'schema'}
        )

    start = sa.Column(pg.TIMESTAMP, autoincrement=False, primary_key=True)
    end = sa.Column(pg.TIMESTAMP, nullable=False)

后来,我想使用 alembic 工具,它应包括降级操作,如下:

 op.drop_index('index', 'tablename', schema='schema')

这实际上具有以下SQL:

 DROP INDEX IF EXISTS schema.index

你有问题吗?你是在寻找如何定义一个函数索引的方法吗? - Ilja Everilä
我不确定自己是否了解足够的知识来提出正确的问题。但是,在__table_args__中,我有一个# ????。我认为我需要修改那一行以产生我想要的sql语句。我只是不知道该去哪里查找或者sqlalchemy的术语是什么。定义一个函数可能是正确的方法,但从文档中并不明显如何将所有内容混合在一起(postgres GIST,TSRANGE,SQLAlchemy Index,SQA functional index等)。 - Brian Bruggeman
你可能会在使用alembic时遇到这个问题:https://dev59.com/IZ_ha4cB1Zd3GeqPsAU5。 - Ilja Everilä
1个回答

9

SQLAlchemy的索引支持传递SQL函数表达式,前提是后端支持函数索引:

import sqlalchemy as sa

class Tablename(Mixins):

    start = sa.Column(pg.TIMESTAMP, autoincrement=False, primary_key=True)
    end = sa.Column(pg.TIMESTAMP, nullable=False)

    __table_args__ = (
        sa.Index('index_name', sa.func.tsrange(start, end),
                 postgresql_using="gist"),
        {'schema': 'schema'}
        )

请注意,如果将__table_args__定义移动到列属性定义之后,则可以在SQL函数表达式中使用它们。

太棒了!稍后会试一下。谢谢! - Brian Bruggeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接