snowflake-cloud-data-platform - Snowflake 数据仓库中的模式版本控制
问题描述
我对通过使用模式版本控制使雪花数据库的用户免受更改的方式感兴趣。我一直在研究使用连接语法来定义一个模式,其中将为每个版本创建一个包含核心表视图的新模式,任何未更改的视图都将被复制其他经过修改的视图将向后兼容。当用户连接时,理想情况下会为他们提供所需版本的正确连接语法。
我遇到的问题是,有多个团队各自拥有与核心业务领域相关的模式,我认为不可能在连接语法中定义多个模式。
有没有人在具有多个用户、模式和开发团队的环境中实现了这一点?
问候,
卢克
解决方案
我们使用 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 有任何其他问题,或者您对此感兴趣,那么我很乐意解释更多。
推荐阅读
- python - 处理 JSON 响应、编辑和发送
- vue.js - Vue.js 路由在刷新时发送到 404
- python - 在 playbook 上使用 Ansible for netstat 命令和格式
- assembly - 如何在程序集文件中包含另一个文件?
- javascript - 将数组转换为具有相同输入名称的对象javascript
- javascript - 如何检查是否
- 元素具有特定值
- c# - EF Core 和 MySQL - “CREATE DATABASE” Sql 命令给出错误:您的 SQL 语法有错误
- python-3.x - 使用 Pandas 在 Jupyter 笔记本中选择数据集中的不同行
- javascript - 是否有mongoose model.translateAliases 函数的逆函数
- python - 使用 python 的 stanford-nlp 中的回指解析不起作用