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

Posted

技术标签:

【中文标题】SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)【英文标题】:SQLAlchemy declarative: defining triggers and indexes (Postgres 9) 【发布时间】:2012-02-14 07:54:32 【问题描述】:

表的 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 列? 【参考方案1】:

指标易于创建。对于带有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 数据类型:值得单独提问。

【讨论】:

以上是关于SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)的主要内容,如果未能解决你的问题,请参考以下文章

使用 sqlalchemy 的声明性 ORM 扩展时的多列索引

声明式 SQLAlchemy 关系()的入门问题

将 SQLAlchemy 声明式基础与 SQL 模型一起使用

如何在 SQLAlchemy 1.2.7 中创建没有定义类的新表

18-Jenkisn-Pipelin-声明式流水线语法-triggers/stage/tool

如何在sqlalchemy中的值更改后触发事件