28

テーブルのSQLAlchemyクラスに、そのテーブルのトリガーとインデックスを定義/作成する方法はありますか?

たとえば、私が次のような基本的なテーブルを持っていた場合...

class Customer(DeclarativeBase):
    __tablename__ = 'customers'
    customer_id = Column(Integer, primary_key=True,autoincrement=True)
    customer_code = Column(Unicode(15),unique=True)
    customer_name = Column(Unicode(100))
    search_vector = Column(tsvector) ## *Not sure how do this yet either in sqlalchemy*.

「search_vector」を更新するトリガーを作成します

CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE
ON customers
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(search_vector,'pg_catalog.english',customer_code,customer_name);

次に、そのフィールドをインデックスとしても追加したかった...

create index customers_search_vector_indx ON customers USING gin(search_vector);

今のところ、アプリから何らかのデータベースの再生成を行った後、tsvector列の列の追加、トリガー定義、およびpsqlからのインデックスステートメントを実行する必要があります。世界の終わりではありませんが、一歩を忘れがちです。私はすべて自動化に取り組んでいるので、アプリのセットアップ中にこれをすべて実現できれば、ボーナスが得られます!

4

1 に答える 1

45

インデックスは簡単に作成できます。index=True以下のようなパラメータを持つ単一列の場合:

customer_code = Column(Unicode(15),unique=True,index=True)

ただし、名前とオプションをより細かく制御したい場合は、明示的なIndex()構造を使用してください。

Index('customers_search_vector_indx', Customer.__table__.c.search_vector, postgresql_using='gin')

トリガーを作成することもできますが、それでもトリガーをSQLベースにしてイベントにフックする必要がありDDLます。詳細については、 DDLのカスタマイズを参照してください。ただし、コードは次のようになります。

from sqlalchemy import event, DDL
trig_ddl = DDL("""
    CREATE TRIGGER customers_search_vector_update BEFORE INSERT OR UPDATE
    ON customers
    FOR EACH ROW EXECUTE PROCEDURE
    tsvector_update_trigger(search_vector,'pg_catalog.english',customer_code,customer_name);
""")
tbl = Customer.__table__
event.listen(tbl, 'after_create', trig_ddl.execute_if(dialect='postgresql'))

補足:データ型を構成する方法がわかりませんtsvector:別の質問に値します。

于 2012-01-19T18:09:08.543 に答える