2012-01-19 2 views
20

Есть ли способ в классе SQLAlchemy таблицы определить/создать триггеры и индексы для этой таблицы?SQLAlchemy declarative: определение триггеров и индексов (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')) 

Sidenote: Я не знаю, как настроить tsvector тип данных: заслуживает отдельный вопрос.

Смежные вопросы