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 声明式基础与 SQL 模型一起使用
如何在 SQLAlchemy 1.2.7 中创建没有定义类的新表