2012-01-19 51 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); 

現在,我做任何類型的數據庫從我的應用程序再生我必須做t他爲tsvector列添加列,觸發器定義,然後從psql添加索引語句。不是世界的盡頭,但很容易忘記一步。我都是關於自動化的,所以如果我能在應用程序設置期間得到這一切,那麼獎金!

+0

在哪裏可以找到如何創建tsvector列? – d0ugal

回答

34

條款是直接創建。對於單柱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數據類型:需要單獨的問題。