首页 > 解决方案 > Snowflake 数据仓库中的模式版本控制

问题描述

我对通过使用模式版本控制使雪花数据库的用户免受更改的方式感兴趣。我一直在研究使用连接语法来定义一个模式,其中将为每个版本创建一个包含核心表视图的新模式,任何未更改的视图都将被复制其他经过修改的视图将向后兼容。当用户连接时,理想情况下会为他们提供所需版本的正确连接语法。

我遇到的问题是,有多个团队各自拥有与核心业务领域相关的模式,我认为不可能在连接语法中定义多个模式。

有没有人在具有多个用户、模式和开发团队的环境中实现了这一点?

问候,

卢克

标签: snowflake-cloud-data-platform

解决方案


我们使用 Alembic 作为 Snowflake 的数据库版本控制。Alembic 是一个“迁移”工具,您可以在其中对数据仓库运行多项更改(或迁移)。它本质上是 Python 中 SQLAlchemy 库的附加组件。

在本地开发时,我们创建数据库的克隆,并测试我们对克隆数据库的迁移更改。一旦我们知道它有效,我们将它推送到 GitLab,让它获得批准,然后我们可以运行一个 CI/CD 管道,该管道具有accountadmin在生产中进行更改的凭据。

由于它是用 Python 编写的,因此您可以将其连接到您的 Git 工具(如 GitHub 或 GitLab)并在合并请求中提交更改并获得批准,然后再在您的生产数据库中运行它。

这是文档:https ://alembic.sqlalchemy.org/en/latest/

根据 Snowflake 文档,这也得到了官方支持:https ://docs.snowflake.net/manuals/user-guide/sqlalchemy.html#alembic-support

一个示例 Alembic 迁移可能如下所示:


Revision ID: 78a3acc7fbb2
Revises: 3f2ee8d809a6
Create Date: 2019-11-06 11:40:38.438468

"""

# revision identifiers, used by Alembic.
revision = '78a3acc7fbb2'
down_revision = '3f2ee8d809a6'
branch_labels = None
depends_on = None

from alembic import op
import sqlalchemy as sa

def upgrade():
    op.create_table('test_table',
    sa.Column('op', sa.String(length=255), nullable=True),
    sa.Column('id', sa.String(length=255), nullable=False),
    sa.Column('amount', sa.BigInteger(), nullable=True),
    sa.Column('reason', sa.String(length=255), nullable=True),
    sa.Column('deleted', sa.Boolean(), nullable=True),
    sa.Column('user_id', sa.Integer(), nullable=True),
    sa.Column('company_id', sa.Integer(), nullable=True),
    sa.Column('inserted_at', sa.DateTime(), nullable=True),
    sa.Column('updated_at', sa.DateTime(), nullable=True),
    sa.Column('dw_import_filename', sa.String(length=255), nullable=True),
    sa.Column('dw_import_file_row_number', sa.Integer(), nullable=True),
    sa.Column('dw_import_timestamp', sa.TIMESTAMP(), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    schema='test_schema'
    )

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('test_table', schema='test_schema')

如您所见,您必须提供升级并具有降级的能力,这与升级相反。如果您对 Alembic 有任何其他问题,或者您对此感兴趣,那么我很乐意解释更多。


推荐阅读