为了方便,我这里直接将 PostgreSQL 的 Helm Chart 模板渲染后的 YAML 文件添加到 SchemaHero 代码仓库中去,这里我们部署到一个名为 schemahero-tutorial 的命名空间中去:
$ kubectl create ns schemahero-tutorial $ kubectl Apply -n schemahero-tutorial -f https://raw.githubusercontent.com/schemahero/schemahero/main/examples/tutorial/postgresql/postgresql-11.8.0.yaml
PostgreSQL 部署完成后,我们可以使用下面的命令连接到该数据库实例:
$ kubectl exec -it -n schemahero-tutorialpostgresql-0 -- psql -U airlinedb-user -d airlinedb
其中 airlinedb-user 的密码为 password 。
这里我们使用前面介绍过的 Beekeeper Studio 这个数据库管理工具来管理该数据库实例 。
默认情况下上面我们部署的 PostgreSQL 实例无法在集群外访问,所以我们可以使用 kubectl 创建一个端口转发来暴露该数据库实例 。
$ kubectl port-forward -n schemahero-tutorial svc/postgresql 5432:5432
然后我们就可以使用用户 airlinedb-user 、数据库 airlinedb 和密码 password 连接到数据库 127.0.0.01:5432 。
文章插图
连接后可以看到现在数据库还是空的 。
文章插图
现在我们已经在集群中运行了 SchemaHero 和 PostgreSQL 实例,接下来我们可以向 SchemaHero 提供数据库信息,以便我们可以管理该数据库 。我们可以通过使用连接信息将自定义资源部署到集群来实现 。
database 对象可以允许 SchemaHero 管理数据库的 schema, database 中定义包括名称类型和连接参数 。我们这里创建一个名为 airline-db.yaml 的文件,内容如下所示:
apiVersion: databases.schemahero.io/v1alpha4 kind: Database metadata:name: airlinedbnamespace: schemahero-tutorial spec:connection:postgres:uri:valueFrom:secretKeyRef:name: postgresqlkey: uri
上面定义的 Database 就是 Schemahero 定义的一个 CRD 对象,这里我们是通过一个 secretKeyRef 引用前面 PostgreSQL 部署的一个身份验证数据,SchemaHero 支持从 inline、secrets 或 HashiCorp Vault 读取凭据 。直接应用上面的资源对象即可 。
$ kubectl apply -f airline-db.yaml$ kubectl get databases -n schemahero-tutorial NAME AGE airlinedb 47m
现在我们就可以通过 SchemaHero 来管理我们的 PostgreSQL 实例了,接下来我们使用 SchemaHero 将一个新表部署到这个实例中 。新建表在这一步中,我们将把几个表部署到前面创建的 airlinesdb 数据库中去 。在执行该操作时,我们将在 SchemaHero 中执行批准和拒绝工作流程,以了解如何在执行这些变更之前对其进行验证 。
首先我们先定义一个简单的 airports 表,然后在我们的数据模型在定义路由时使用它 。该表我们只定义了 2 列来表示机场代码和名称 。
在使用 SchemaHero 之前我们可能会编写如下所示的 SQL 语句 。
CREATE TABLE airport( code char(4) not null primary key,name varchar(255))
而现在我们有了 SchemaHero 之后,就不需要编写 SQL 语句了,我们只需要创建为一个 SchemaHero 的 Table 自定义对象 。创建一个名为 airport-table.yaml 的资源清单文件,如下所示:
apiVersion: schemas.schemahero.io/v1alpha4 kind: Table metadata:name: airportnamespace: schemahero-tutorial spec:database: airlinedbname: airportschema:postgres:primaryKey: [code]columns:- name: codetype: char(4)- name: nametype: varchar(255)constraints:notNull: true
其中 spec.database 用来关联前面定义的 database 对象, spec.name 是 Postgres 数据库中真实的数据表名称,然后在 spec.schema 中定义表的结构, primaryKey 可以用来指定主键, columns 定义数据表的列定义 。同样直接应用该资源对象即可 。
$ kubectl apply -f airport-table.yaml
需要注意的是尽管我们部署了 table 对象,但表结构并不会自动更改 。相反,一个新的(或编辑的) table 对象将生成一个 migration 对象,可以检查然后批准或拒绝该变更 。默认情况下, SchemaHero 需要审批流程,因为某些数据库结构迁移可能具有破坏性,可以通过向 database 对象添加属性来启用立即部署(未经批准) 。我们可以通过下面的命令查看到处于 pending 状态的迁移对象 。
推荐阅读
- 在.Net 7原生支持Webp和Heif格式文件生成
- Intel|Intel全新加速显卡Arctic Sound-M出货:8路4K云游戏无压力
- 奇瑞风云二的车到底好不好 奇瑞风云2怎么样
- 江波|精选诗词|?一路须随云露冷,只身欲返月明空
- 岳云鹏数30数字游戏 数30怎么玩必赢
- 名将赵云之死 赵云怎么死的
- 新手如何看大盘? 如何看大盘
- 云吞馅的做法和配料
- 为什么紫云英成为了矿工 为什么紫云英成为了“矿工”
- 印度法院传唤马云,究竟发生了什么事情? 马云近几天出什么事了