Go数据库迁移的实现步骤浅谈

本文介绍了Go语言中两个常用的数据库迁移工具golang-migrate和gormigrate的使用方法。包括通过命令行操作和Go SDK实现数据库迁移的步骤,详细讲解了如何创建SQL文件、执行迁移、回滚操作以及如何进行增量迁移,如新增列、创建索引等。
摘要由CSDN通过智能技术生成

 

本文将介绍两个Go生态中常见的数据库迁移工具——golang-migrategormigrate

1. golang-migrate

golang-migrate的官方Github是链接。它提供了客户端的方式使用,也可以使用Go SDK调用的方式使用。其各种安装方式详见链接。

对于每次迁移而言,都需要有一个迁移文件,迁移文件需要命名为{number}_xxx.up.sql以及{number}_xxx.down.sql,其中{number}是数字,可以使用migrate create命令产生,如下,-seq表示按顺序产生文件:

1

migrate create -ext sql -dir ./migration_files -seq init_schema

{number}将会是从1开始的递增的数字。如下,默认按照时间格式产生,-tz可以设置时区:

1

migrate create -ext sql -dir ./migration_files -tz Asia/Shanghai init_schema

{number}将会是上海时区的时间格式。反正不管是什么格式,golang-migration按照从小到大的顺序依次执行。

在实际运行时,迁移时顺序运行{number}_xxx.up.sql文件,回滚时倒序运行{number}_xxx.down.sql

1.1 通过migrate命令操作

1.1.1 创建sql文件

初始化数据库

我们可以通过安装migrate工具,然后通过指令进行操作如下,生成20230616164949_init.up.sql20230616164949_init.down.sql文件:

1

2

3

$ migrate create -ext sql -dir ./migration_files -tz Asia/Shanghai init      

xxx/migration_files/20230616164949_init.up.sql

xxx/migration_files/20230616164949_init.down.sql

20230616164949_init.up.sql中填写:

1

2

3

4

5

6

7

8

9

10

-- ----------------------------

-- Table structure for person

-- ----------------------------

DROP TABLE IF EXISTS `person`;

CREATE TABLE `person` (

  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `name` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

  `age` bigint(20) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

20230616164949_init.down.sql中填写:

1

DROP TABLE IF EXISTS `person`;

新增一列

然后我们给person表新增一个性别gender列,先使用命令创建sql文件:

1

2

3

$ migrate create -ext sql -dir ./migration_files -tz Asia/Shanghai add_gender

xxx/migration_files/20230616165624_add_gender.up.sql

xxx/migration_files/20230616165624_add_gender.down.sql

20230616165624_add_gender.up.sql

1

ALTER TABLE `person` ADD COLUMN `gender` BIGINT(20) DEFAULT NULL AFTER `age`;

20230616165624_add_gender.down.sql

1

ALTER TABLE `person` DROP COLUMN `gender`;

新增name为index

接下来,我们为name列创建一个索引,同样需要用命令创建sql文件:

1

2

3

$ migrate create -ext sql -dir ./migration_files -tz Asia/Shanghai add_index_name                                                                         

xxx/migration_files/20230619104829_add_index_name.up.sql

xxx/migration_files/20230619104829_add_index_name.down.sql

20230619104829_add_index_name.up.sql

1

ALTER TABLE `person` ADD INDEX `idx_name`(`name`);

20230619104829_add_index_name.down.sql

1

ALTER TABLE `person` DROP INDEX `idx_name`;

此时在迁移文件中有以下文件:

1

2

3

4

5

6

7

8

$ ll migration_files

total 48

-rw-r--r--  1 chenyiguo  staff    30B Jun 16 16:55 20230616164949_init.down.sql

-rw-r--r--  1 chenyiguo  staff   396B Jun 16 16:55 20230616164949_init.up.sql

-rw-r--r--  1 chenyiguo  staff    42B Jun 16 17:02 20230616165624_add_gender.down.sql

-rw-r--r--  1 chenyiguo  staff    77B Jun 16 17:01 20230616165624_add_gender.up.sql

-rw-r--r--  1 chenyiguo  staff    43B Jun 19 10:57 20230619104829_add_index_name.down.sql

-rw-r--r--  1 chenyiguo  staff    50B Jun 19 10:57 20230619104829_add_index_name.up.sql

1.1.2 进行迁移

一步迁移

我们可以使用如下指令每次执行一步迁移:

1

2

3

4

5

6

$ migrate --path ./migration_files --database="mysql://root:IBHojwND.yo@tcp(10.117.49.6:13306)/migration_test?charset=utf8mb4&parseTime=true" -verbose up 1

2023/06/19 11:01:28 Start buffering 20230616164949/u init

2023/06/19 11:01:28 Read and execute 20230616164949/u init

2023/06/19 11:01:28 Finished 20230616164949/u init (read 133.166833ms, ran 286.737042ms)

2023/06/19 11:01:28 Finished after 566.083083ms

2023/06/19 11:01:28 Closing source and database

然后查看表person:

1

2

3

4

5

6

7

8

9

MariaDB [migration_test]> DESC `person`;

+-------+---------------------+------+-----+---------+----------------+

| Field | Type                | Null | Key | Default | Extra          |

+-------+---------------------+------+-----+---------+----------------+

| id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |

| name  | varchar(256)        | YES  |     | NULL    |                |

| age   | bigint(20)          | YES  |     | NULL    |                |

+-------+---------------------+------+-----+---------+----------------+

3 rows in set (0.001 sec)

这时候,会发现数据库会生成一个名为schema_migrations的表,可以看到其只有两列,其中第一列version表示现阶段的版本,比如以上我们只是执行了迁移的第一步,所以版本是20230616164949;第二列是dirty,0表示正常,1表示被出错了,一般而言需要手动处理。

1

2

3

4

5

6

7

MariaDB [migration_test]> SELECT * FROM `schema_migrations`;

+----------------+-------+

| version        | dirty |

+----------------+-------+

| 20230616164949 |     0 |

+----------------+-------+

1 row in set (0.001 sec)

同样的,我们可以使用以下指令回滚这一次操作:

1

2

3

4

5

6

$ migrate --path ./migration_files --database="mysql://root:IBHojwND.yo@tcp(10.117.49.6:13306)/migration_test?charset=utf8mb4&parseTime=true" -verbose down 1

2023/06/19 11:12:57 Start buffering 20230616164949/d init

2023/06/19 11:12:57 Read and

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值