Alembic 迁移#
对数据库架构进行更改时,必须确保随之更新关联的搜索触发器和触发器功能。SQLAlchemy-Searchable 为此提供了两个帮助函数:sync_trigger()
和 drop_trigger()
。
- sqlalchemy_searchable.sync_trigger(conn, table_name, tsvector_column, indexed_columns, metadata=None, options=None, schema=None, update_rows=True)[源代码]#
同步指定 table、search vector column 的搜索触发器和触发器功能。此函数在内部执行以下 SQL 查询
如果已存在,则删除指定 table、column 的搜索触发器。
如果已存在,则删除指定 table、column 的搜索函数。
创建指定 table、column 的搜索函数。
创建指定 table、column 的搜索触发器。
通过针对指定 table 执行 column=column update 查询,更新给定搜索向量的所有行。
示例
from sqlalchemy_searchable import sync_trigger sync_trigger( conn, 'article', 'search_vector', ['name', 'content'] )
此函数尤其适用于处理 Alembic 迁移。在以下示例中,我们将
content
column 添加到article
表,然后同步触发器以包含此新 columnfrom alembic import op from sqlalchemy_searchable import sync_trigger def upgrade(): conn = op.get_bind() op.add_column('article', sa.Column('content', sa.Text)) sync_trigger(conn, 'article', 'search_vector', ['name', 'content']) # ... same for downgrade
如果你使用矢量器,则需要在你的迁移文件中初始化它们,并将它们传递给此函数
import sqlalchemy as sa from alembic import op from sqlalchemy.dialects.postgresql import HSTORE from sqlalchemy_searchable import sync_trigger, vectorizer def upgrade(): vectorizer.clear() conn = op.get_bind() op.add_column('article', sa.Column('name_translations', HSTORE)) metadata = sa.MetaData(bind=conn) articles = sa.Table('article', metadata, autoload=True) @vectorizer(articles.c.name_translations) def hstore_vectorizer(column): return sa.cast(sa.func.avals(column), sa.Text) op.add_column('article', sa.Column('content', sa.Text)) sync_trigger( conn, 'article', 'search_vector', ['name_translations', 'content'], metadata=metadata ) # ... same for downgrade
- 参数:
conn – SQLAlchemy 连接对象
table_name – 要应用搜索触发器同步的表的名称
tsvector_column – 用作搜索索引列的 TSVector 类型的列
indexed_columns – 全文索引列名,作为列表
metadata – 用于自动加载表的可选 SQLAlchemy 元数据对象。如果给定 None,则在这个函数中初始化一个新的 MetaData 对象。
options – 配置选项的字典
schema – 这个表格的模式名称。默认为
None
。update_rows – 如果设置为 False,则向量列中的值将保持不变,直到索引列之一被更新。
- sqlalchemy_searchable.drop_trigger(conn, table_name, tsvector_column, metadata=None, options=None, schema=None)[source]#
删除给定表和搜索向量列的搜索触发器和触发器函数。在内部,此函数执行以下 SQL 查询
如果存在,则删除给定表的搜索触发器。
如果存在,则删除给定表的搜索函数。
示例
from alembic import op from sqlalchemy_searchable import drop_trigger def downgrade(): conn = op.get_bind() drop_trigger(conn, 'article', 'search_vector') op.drop_index('ix_article_search_vector', table_name='article') op.drop_column('article', 'search_vector')
- 参数:
conn – SQLAlchemy 连接对象
table_name – 要应用搜索触发器删除的表的名称
tsvector_column – 用作搜索索引列的 TSVector 类型的列
metadata – 用于自动加载表的可选 SQLAlchemy 元数据对象。如果给定 None,则在这个函数中初始化一个新的 MetaData 对象。
options – 配置选项的字典
schema – 这个表格的模式名称。默认为
None
。