gpt4 book ai didi

postgresql - SQLAlchemy 声明式 : defining triggers and indexes (Postgres 9)

转载 作者:行者123 更新时间:2023-11-29 11:08:44 25 4
gpt4 key购买 nike

在表的 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 的索引语句。不是世界末日,但很容易忘记一步。我对自动化很感兴趣,所以如果我能在应用程序设置过程中实现这一切,那就太好了!

最佳答案

索引创建起来很简单。对于带有 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 数据类型:值得一个单独的问题。

关于postgresql - SQLAlchemy 声明式 : defining triggers and indexes (Postgres 9),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8929738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com