在一个表的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列执行add列、触发器定义,然后是psql中的index语句.不是世界末日,而是很容易忘记的一步.我非常关注自动化,所以如果我能在应用程序安装过程中实现这一切,那么 prize !

推荐答案

Indicies是直接创造的.对于具有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')

Triggers也可以创建,但这些仍然需要以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'))

Sidenote: I do not know how to configure 100 datatype: deserves a separate question.

Postgresql相关问答推荐

环境变量在Bash应用程序中没有出现

在特定距离内创建点的唯一索引

有没有办法共享数据或监控复杂 PostgresQL 事务的进度?

使用 OpenCypher 和 Apache AGE 在两个顶点之间创建双向关系

如何创建一个触发器来传播对主键表的更新?

如何在 MockDataProvider 中创建自定义 JOOQ 记录?

Power BI + Postgres:只读用户

计算每行的多列中的非 NULL 元素

Postgresql如何从jsonB列的数组中的多个json中 Select 一个值

包含受先前 DELETE 影响的行数的变量?

如何 Select 列值为空的行?

Postgres 默认按 id 排序 - worldship

从 PostgreSQL 中的时间戳获取日期

Postgres jsonbNOT contains运算符

获取 psycopg2 count(*) 结果数

如何在我的 Mac 上卸载 postgresql(运行 Snow Leopard)

使用 Postgresql 在过滤器中制作 Sqlalchemy 使用日期

由于不支持身份验证类型 10,无法连接到 Postgres DB

升级到 Yosemite 10.10 后无法连接到 postgresql 数据库

Capistrano 与 PostgreSQL,错误:database is being accessed by other users