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 回答