开源项目的最佳实践:像管理代码一样管理数据库的变更(Go库)
关注公众号 “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(31) NOT NULL DEFAULT '',
email varchar(63) NOT 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 的内容如下:
version | dirty |
---|---|
1 | FALSE |
如果这时再执行如下命令进行“回滚”:
$ 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(127) NOT 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