开源项目的最佳实践:像管理代码一样管理数据库的变更(Go库)

共 3371字,需浏览 7分钟

 ·

2020-08-05 00:45

关注公众号 “OpenSourceDaily” ,每天推荐给你优秀开源项目

大家好,我是欧盆索思(opensource),每天为你带来优秀的开源项目!

我们知道,代码的变更可以通过 Git 进行管理,通过 Git 可以很容易的实现代码的回滚。于是有人就想,代码变更时,很可能数据表的结构也变了,那有没有可能很方便的对数据库的变化进行回滚呢(升降版本)?于是有了 database migrate。就开源项目而言,对数据库自动升降级很有帮助。

然而数据库迁移并没有标准,依赖于具体的工具实现。迁移工具一般分为两种:1)独立的迁移软件,如 Liquibase;2)依附于具体语言的库,比如 Go 语言的 migrate,不过这个库也可以作为独立的软件使用。

每一次 schema 的变更,有时包括初始化数据,通常会记录在一个单独的脚本文件中。通常每一次数据库变更,应该生成一个对应的文件。今天推荐和讲解这个 Go 语言项目。

项目地址:https://github.com/golang-migrate/migrate,Star 数 4.6k+。

简介

该项目是 Go 语言实现的数据库迁移工具,支持 CLI 方式使用,也支持作为库导入使用。Migrate 从源读取迁移,并将迁移以正确的顺序应用于数据库。

目前该工具支持如下数据库:

  • PostgreSQL
  • Redshift
  • Ql
  • Cassandra
  • SQLite (todo #165)
  • MySQL/ MariaDB
  • Neo4j
  • MongoDB
  • CrateDB (todo #170)
  • Shell (todo #171)
  • Google Cloud Spanner
  • CockroachDB
  • ClickHouse
  • Firebird
  • MS SQL Server

迁移来源支持如下几种:

  • Filesystem - 从文件系统读取
  • Go-Bindata - 从内嵌的二进制数据读取
  • Github - 从远程 GitHub 仓库读取
  • Github Enterprise - 从远程 Github 企业仓库读取
  • Gitlab - 从远程 Gitlab 仓库读取
  • AWS S3 - 从 Amazon Web Services S3 读取
  • Google Cloud Storage - 从 Google Cloud Platform Storage 读取

简单教程

先安装,以 MacOS 为例:

$ brew install golang-migrate

本地创建一个项目,用于演示:migrate-demo,然后创建一个迁移:

$ migrate create -ext sql -dir migrations -seq initial_schema_from_pg_dump

成功后会在 migrations 目录下生成两个文件:

migrations
├── 000001_initial_schema_from_pg_dump.down.sql
└── 000001_initial_schema_from_pg_dump.up.sql

这里有两个基本概念需要清楚:up 和 down,上面两个文件中有包含。

  • up 表示升级到当前版本;
  • down 表示回退到上一版本;

所以,我们在上面两个文件中填上如下内容:

// up 文件的内容
CREATE TABLE gopher (
    id serial PRIMARY KEY,
    username varchar(31NOT NULL DEFAULT '',
    email varchar(63NOT NULL DEFAULT '',
    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);

comment on table gopher is 'gopher用户表';
comment on column gopher.username is '用户名';

// down 文件的内容
DROP TABLE
    gopher;
  • up 文件的内容是创建表 gopher;
  • down 文件的内容是删除表 gopher;

之后就可以进行迁移操作了(这里假定你本地已经装上 postgres,密码是 123456,同时创建了 testpkg 数据库):

$ migrate -database "postgres://postgres:123456@localhost:5432/demo?sslmode=disable" -source file:migrations up

这时会发现数据库中多了两个表:gopher 和 schema_migrations。其中 schema_migrations 的内容如下:

versiondirty
1FALSE

如果这时再执行如下命令进行“回滚”:

$ migrate -database "postgres://postgres:123456@localhost:5432/demo?sslmode=disable" -source file:migrations down

为了安全,会如下提示:

Are you sure you want to apply all down migrations? [y/N]

选择 y,成功后再看看数据库的变化,发现 gopher 表不见了,schema_migrations 表的内容也清空了,因为上次是版本 1 ,这次回退了。

为了进一步了解细节,我们再创建一个迁移,增加一个表:

$ migrate create -ext sql -dir migrations -seq add_article_table

会生成两个文件,现在有 4 个文件了:

migrations
├── 000001_initial_schema_from_pg_dump.down.sql
├── 000001_initial_schema_from_pg_dump.up.sql
├── 000002_add_article_table.down.sql
└── 000002_add_article_table.up.sql

注意到没?文件名前缀自动变为了 00002。同样,我们在新生成的两个文件中填上如下内容:

// up 文件内容
CREATE TABLE article (
    id serial PRIMARY KEY,
    title varchar(127NOT NULL DEFAULT '',
    content text NOT NULL,
    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);

// down 文件内容
DROP TABLE
    article;

之后执行迁移命令:

$ migrate -database "postgres://postgres:123456@localhost:5432/demo?sslmode=disable" -source file:migrations up

输出:

1/u initial_schema_from_pg_dump (126.243958ms)
2/u add_article_table (160.978164ms)

查看数据库,发现 gopher 和 article 表都有了,schema_migrations 表中 version 字段值是 2,符合预期。

除此之外,你也可以把它当做一个包使用,具体可以查看官方文档。


文末「阅读原文」可直达项目首页。


今天的项目大家觉得怎么样吗?如果你喜欢,请在文章底部留言、点赞或关注转发,你的支持就是我持续更新的最大动力!


推荐阅读




OpenSourceDaily - 送给爱开源的你

Git · GitHub · GitLab · Gitee


浏览 99
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报