Superset的数据库版本管理
本章我们将从Superset的数据库版本管理使用,到其背后的Flask-migrate框架为脉络,讲述数据库版本管理。
Superset的数据库版本管理使用了flask-migrate作为管理框架。
相关的入门指南可以参考官方文档
https://flask-migrate.readthedocs.io/en/latest/
而在Superset中,我们在第一章安装Superset的时候,曾经执行过一个命令
superset db upgrade
这个命令就是利用内部存储的数据库版本文件进行数据库版本的应用
这个命令会读取APP_DIR/migrations文件夹下的文件,其下每个文件内部格式为
这里我们以一个官方的migrate管理py来进行讲解
“””Add verbose name to DruidCluster and Database
Revision ID: db527d8c4c78 “”” # revision identifiers, used by Alembic. revision = “db527d8c4c78” down_revision = “b318dfe5fb6c” import logging import sqlalchemy as sa from alembic import op def upgrade(): op.add_column( “clusters”, sa.Column(“verbose_name”, sa.String(length=250), nullable=True) ) op.add_column( “dbs”, sa.Column(“verbose_name”, sa.String(length=250), nullable=True) ) try: op.create_unique_constraint(None, “dbs”, [“verbose_name”]) op.create_unique_constraint(None, “clusters”, [“verbose_name”]) except Exception: logging.info(“Constraint not created, expected when using sqlite”) def downgrade(): try: op.drop_column(“dbs”, “verbose_name”) op.drop_column(“clusters”, “verbose_name”) except Exception as ex: logging.exception(ex) |
其在最上面的注解中,说明了本py对应的功能,以及revision版本
并且class上说明了revision和down_revision
如果更新成功,那么revision会被更新到数据库中版本管理对应的table作为当前vision。如果需要回滚,则以down_revision为准,需要注意,数据库版本应该如同一个Node实现的队列,一个revision后面只能跟着一个py将其设置为down_revision,如果存在多个down_revision指向同一个数据库版本管理文件,则会出现upgrade报错的问题。
除此外就是两个函数,upgrade和downgrade
分别对应了升级和回滚。
在本类之中,升级则是给clusters和dbs两个表新增了两个字段以及创建了唯一键约束。
而在回滚函数中,则是对应的删除操作。
那么在声明了相关的py文件之后,只需要superset db upgrade即可。
这一命令在helm中的values.yaml也可以看见
initscript: |-
#!/bin/sh set -eu echo “Upgrading DB schema…” superset db upgrade |
如果在开发过程中,给数据库中新增了某些表或某些字段,那么只需要执行
superset db migrate,就会在migrations文件夹下新增一个py文件,格式如同上面的一样。
那么到了这里,基本上就就是Superset中关于db migrate的使用,这样我们利用对应py文件进行了管理。
接下来我们看下,Superset是如何集成migrate框架的。
首先,如果希望使用migrate框架的话,需要利用到SQLAlchemy的对象进行初始化,这一点,在Superset init_app的时候就有体现。
在初始化相关的init_app函数中setup_db函数里
def setup_db(self) -> None:
db.init_app(self.superset_app) with self.superset_app.app_context(): pessimistic_connection_handling(db.engine) migrate.init_app(self.superset_app, db=db, directory=APP_DIR + “/migrations”) |
通过这种方式,Superset在初始化之初,进行了migrate框架的初始化。