2012-01-19 44 views
20

テーブルのSQLAlchemyクラスに、そのテーブルのトリガとインデックスを定義/作成する方法はありますか?例えばSQLAlchemy宣言:トリガとインデックスの定義(Postgres 9)

私は基本的なテーブルにのような...

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のindex文を追加します。世界の終わりではなく、忘れがちなステップ。私はオートメーションのすべてですので、もし私がアプリのセットアップ中にこのボーナスをすべて得ることができます!

+0

ここで、tsvector列の作成方法を知ることができましたか? – d0ugal

答えて

34

Indiciesは簡単に作成できます。以下のような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イベントにフックする必要があります。詳細はCustomizing 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データ型を設定する方法がわからないが:個別の質問に値します。

関連する問題