Goose:Go语言渐进式的数据库迁移工具

news/2024/10/10 16:14:45

Goose:Go语言渐进式的数据库迁移工具

源自开发者
专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。
214篇原创内容

数据库迁移是软件开发过程中重要的一部分,随着业务的发展和需求的变化,数据库结构经常需要做出调整。Goose 是一个出色的数据库迁移工具,它通过 SQL 脚本和 Go 函数支持渐进式的数据库变化。下面是一篇详细的文章,它将深入介绍 Goose 的用法,并提供丰富的示例帮助你开始使用 Goose

Goose 简介

Goose 是一款能够管理数据库架构变更的工具,提供了一系列命令来帮助开发者创建和应用迁移。从 v3.0.0 版本开始,Goose 增加了对 Go 模块的支持,同时也兼容了旧的 v2.x.y 版本。它支持将 SQL 迁移嵌入到 Go 应用中,要求 Go 版本 1.16 及以上。如果你使用的是 Go 1.15 或更低版本,则需要使用 v3.0.1

Goose 安装

直接通过 go 命令安装 Goose

go install github.com/pressly/goose/v3/cmd/goose@latest

此命令将会安装 Goose 可执行文件到 $GOPATH/bin 目录。

对于不希望安装与数据库连接相关命令的轻量版,可以使用独有的构建标签:

go build -tags='no_postgres no_mysql no_sqlite3 no_ydb' -o goose ./cmd/goose

对于 macOS 用户,Goose 可以通过 Homebrew 安装:

brew install goose

查看 Goose 文档获得更多安装说明。

Goose 使用方法

以下表格说明了 Goose 工具的基本用法:

命令描述
up 将数据库迁移到最新的版本
up-to 迁移到特定版本
up-by-one 从当前版本向上迁移一个版本
down 回滚当前版本的前一个版本
down-to 回滚到特定版本
redo 回滚最新应用的迁移然后重新应用
status 输出当前数据库的迁移状态
version 输出数据库当前的版本
create 创建新的迁移文件,可以选择 sql 或 go 格式
fix 应用序列编号到迁移
validate 检查迁移文件,而不实际运行

你可以设置环境变量 GOOSE_DRIVERGOOSE_DBSTRING, 和 GOOSE_MIGRATION_DIR 来定制 Goose 的行为。

SQL 迁移示例

一个 SQL 迁移文件应该包含升级(Up)和(可选的)降级(Down)部分。例如:

-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY(id)
);

-- +goose Down
-- SQL in section 'Down' is executed when this migration is rolled back
DROP TABLE users;

注意:迁移文件必须明确一次只有一个 Up 注释。如果有 Down 注释则必须放在 Up 后面。

Go 迁移示例

对于 Go 迁移,你需要创建一个自定义的 Goose 二进制可执行文件,并显式注册你的迁移函数。

package migrations

import (
    "database/sql"
    "github.com/pressly/goose/v3"
)

func init() {
    goose.AddMigration(Up, Down)
}

func Up(tx *sql.Tx) error {
    // perform a migration
    return nil
}

func Down(tx *sql.Tx) error {
    // perform a migration rollback
    return nil
}

接下来,使用指令 goose up 应用迁移,或者使用 goose down 进行回滚。

高级特性

Goose 提供了一些高级特性,例如:

  • 嵌入式迁移:从 Go 1.16 开始,可以在构建时将迁移文件嵌入二进制文件中,使用 embed 包实现。
  • 环境变量替换:在 SQL 迁移文件中,可以通过特殊的注释标记启用环境变量替换。
  • 混合版本管理:建议在开发过程中使用时间戳进行迁移,在生产环境中使用序列号的版本。

结论

Goose 是一种灵活且强大的迁移工具,适用于多种数据库系统,支持 SQL 和 Go 两种迁移方式。遵循本文的详细介绍和示例,你将能够轻松地开始使用 Goose 进行数据库迁移。不要忘记,实践是学习新技能的最好方式,因此立刻开始尝试使用 Goose 吧!

文章精选

使用 Go 语言连接并操作 SQLite 数据库

Go语言官方团队推荐的依赖注入工具

替代zap,Go语言官方实现的结构化日志包

Go语言常见错误 | 不使用function option模式

必看| Go语言项目结构最佳实践

 

点击关注并扫码添加进交流群领取「Go 语言」学习资料

图片

K8sCat

 来杯冰美式提提神~ 

赞赏二维码钟意作者

Golang推荐项目 · 目录
上一篇Go语言实现开源优雅的跨平台 USDT 收付中间件
阅读原文
阅读 408
 
写留言
 
 
 
 
 
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

数据分析的五大流程:需求、获取、处理、分析、可视化

数据分析的五大流程:需求、获取、处理、分析、可视化

让.NET 8 支持 Windows Vista RTM

众所周知,从 Windows 的每次更新又会新增大量 API,这使得兼容不同版本的 Windows 需要花费很大精力。导致现在大量开源项目已经不再兼容一些早期的 Windows 版本,比如 .NET 8 AOT编译命令行程序时生成的EXE,依赖以下三个函数,经查只有Windows 7 SP1以上系统才包含,具体参…

ABC352

A link\(x\)停不到,\(y\)能停到。 要先判断是从前往后还是从后往前。点击查看代码 #include<bits/stdc++.h>using namespace std;signed main(){int n,x,y,z;cin >> n >> x >> y >> z;if(x <= y){if(z > x&&z <= y) cout <…

SSH远程访问及控制

SSH远程访问及控制 目录SSH远程访问及控制一、SSH远程管理1、SSH的概述二、配置OpenSSH1服务器1、sshd_config配置文件的常用选项设置2、实例操作三、sshd服务支持登录验证方式有:密码验证和密钥对验证,可以设置只使用其中一种,也可以都启用3.1 密码验证:3.2 密钥对验证:四…

8086 汇编学习 Part 9

端口的读写 CPU 的邻居CPU 内部的寄存器 内存单元 端口(各种接口卡、网卡,显卡,主板上的接口芯片等)各种芯片工作时,都有一些寄存器由 CPU 读写 从 CPU 角度,将各寄存器当端口,并统一编制 CPU 用统一的方法与各种设备通信读写端口的指令在对 \([0,255]\) 的端口进行读写…

读天才与算法:人脑与AI的数学思维笔记18_心流机

读天才与算法:人脑与AI的数学思维笔记18_心流机1. 心流机 1.1. 在音乐中你会期盼旋律从不稳定解决到稳定,最终实现某种张力的解决 1.2. 将马尔可夫链系统中的自由与约束条件结合起来,从而形成一种更具结构化的组合 1.3. 美籍匈牙利心理学家米哈里契克森米哈赖(Mihaly Csiks…

Linux网络-ssh远程连接协议

SSH基础 1.ssh协议概述SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能; SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令; SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输…

部署YUM仓库及NFS共享服务

目录1.YUM仓库服务(1)部署YUM软件仓库(1)准备安装源(2)构建CentOs7软件仓库(3)在软件仓库中加入非官方RPM包组(3)如何搭建本地源仓库、ftp源仓库?2.NFS共享存储服务(1)使用NFS发布共享资源 1.YUM仓库服务 (1)部署YUM软件仓库 YUM 基于RPM包构建的软件更新机制 可…