2012-01-19 2 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*. 
지금
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); 

그런 다음 나는 또한 그 필드를 추가하고 싶었다 "search_vector"을 업데이트하는 트리거를 생성 할

색인으로 ...

create index customers_search_vector_indx ON customers USING gin(search_vector); 

지금 내 앱에서 데이터베이스 재생성을 한 후에 그는 tsvector 열의 열, 트리거 정의 및 psql의 index 문을 추가합니다. 세계의 끝이 아니라 단계를 잊기 쉽습니다. 나는 자동화에 관한 모든 것입니다. 그래서이 모든 것들이 앱 설치 중에 보너스가 될 수 있다면!

+0

tsvector 열을 만드는 방법을 알 수있는 곳은 어디입니까? – d0ugal

답변

34

Indicies은 간단합니다. index=True 매개 변수 아래 등으로 단일 C 럼의 경우 :

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 데이터 유형을 구성하는 방법을 모른다 : 별도의 질문을 가치가있다.