SQLAlchemy声明式:定义触发器和索引(Postgres 9)

29

在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执行索引语句。这并不是世界末日,但很容易忘记其中的一步。我非常注重自动化,因此如果我可以在应用程序设置期间完成所有这些操作,那就更好了!


你能找到如何创建tsvector列的方法吗? - d0ugal
1个回答

47

索引很容易创建。对于单列,可以使用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数据类型,这应该提一个单独的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接