2017-07-19 83 views
1

建立索引我想建立基本上看起來像這樣在SQL索引:SQLAlchemy的:聲明ORM - 使用GIST和TSRANGE

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 
+0

這是什麼問題?你在尋找[如何定義一個函數索引](http://docs.sqlalchemy.org/en/latest/core/constraints.html#functional-indexes)? –

+0

我不知道我有足夠的知識來問正確的問題。在__table_args__中,我有一個'#????'。我想我需要按摩那條線來產生我想要的sql。我只是不知道去哪裏尋找什麼,或者什麼命名是爲sqlalchemy找到它的。定義一個函數可能是正確的,但從文檔中可以看出,如何將所有內容混合在一起(postgres GIST,TSRANGE,SQLAlchemy Index,SQA功能索引等)並不明顯 –

+0

您可以運行以下https:// stackoverflow .com/questions/42153301/flask-sqlalchemy-lower-case-index-skipping-functional-not-supported-by-sqlalc with alembic。 –

回答

4

的SQLAlchemy的指數支持通過SQL function expressions,考慮到後端支持功能的指標:

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函數表達式中使用它們。

+0

太棒了!將嘗試一點。謝謝! –

+0

作品。非常感謝! –

相關問題