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 表,然后同步触发器以包含此新 column

from 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