我们使用 Alembic 来控制 Snowflake 的数据库版本。 Alembic 是一个“迁移”工具,您可以在其中对数据仓库运行多项更改(或迁移)。它本质上是 Python 中 SQLAlchemy 库的附加组件。
在本地开发时,我们创建数据库的克隆,并测试我们对克隆数据库的迁移更改。一旦我们知道它有效,我们将其推送到 GitLab,获得批准,然后我们可以运行具有 accountadmin 凭据的 CI/CD 管道,以在生产环境中进行更改。
由于它是用 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 有任何其他问题,或者您对此感兴趣,那么我很乐意解释更多。