golang数据库模式演进管理插件库darwin的使用

golang数据库模式演进管理插件库darwin的使用

Build Status Go Report Card GoDoc

Darwin简介

Darwin是一个用于Go语言的数据库模式演进管理库,它可以帮助开发者管理数据库模式的变更和迁移。

示例代码

下面是一个完整的Darwin使用示例,展示了如何创建迁移并应用到MySQL数据库:

package main

import (
	"database/sql"
	"log"

	"github.com/GuiaBolso/darwin"
	_ "github.com/go-sql-driver/mysql"
)

// 定义迁移列表
var (
	migrations = []darwin.Migration{
		{
			Version:     1,  // 版本号
			Description: "Creating table posts",  // 迁移描述
			Script: `CREATE TABLE posts (
						id INT 		auto_increment, 
						title 		VARCHAR(255),
						PRIMARY KEY (id)
					 ) ENGINE=InnoDB CHARACTER SET=utf8;`,  // SQL脚本
		},
		{
			Version:     2,
			Description: "Adding column body",
			Script:      "ALTER TABLE posts ADD body TEXT AFTER title;",
		},
	}
)

func main() {
	// 连接数据库
	database, err := sql.Open("mysql", "root:@/darwin")
	if err != nil {
		log.Fatal(err)
	}

	// 创建Darwin驱动
	driver := darwin.NewGenericDriver(database, darwin.MySQLDialect{})

	// 初始化Darwin并执行迁移
	d := darwin.New(driver, migrations, nil)
	err = d.Migrate()

	if err != nil {
		log.Println(err)
	}
}

常见问题解答

Q. 为什么没有命令行工具?

A. 这个库的目的就是作为一个库使用。

Q. 如何从文件系统读取迁移?

A. 你可以使用标准库读取文件并构建迁移列表。

Q. 我可以在同一个迁移脚本中放入多个语句吗?

A. 不推荐这样做。每个迁移只做一个数据库变更,如果某个迁移失败,你可以准确知道是哪个语句导致了错误。另外只有PostgreSQL能正确处理DDL事务中的回滚。

为了减少麻烦,你可以像这样组织你的迁移:1.0、1.1、1.2等等。

Q. 为什么没有降级迁移?

A. 请参考Flyway文档中关于降级的说明。

Q. 如果迁移失败,Darwin会执行回滚吗?

A. 请参考Flyway文档中关于回滚的说明。

Q. 处理热修复的最佳策略是什么?

A. 请参考Flyway文档中关于热修复的说明。

许可证

MIT许可证

版权所有 © 2016 Claudemiro

特此免费授予任何获得本软件及相关文档文件(“软件”)副本的人不受限制地处理本软件的权限,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,并允许向其提供本软件的人这样做,但须符合以下条件:

上述版权声明和本许可声明应包含在本软件的所有副本或实质性部分中。

本软件按"原样"提供,不作任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同、侵权或其他方面,由本软件或本软件的使用或其他处理引起、与之相关或与之相关的。


更多关于golang数据库模式演进管理插件库darwin的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang数据库模式演进管理插件库darwin的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Darwin - Golang数据库模式演进管理工具

Darwin是一个用于Golang的数据库模式演进管理工具,它可以帮助开发者管理数据库模式的变更历史,类似于Ruby的Rails Migrations或Java的Flyway。

主要特性

  1. 支持多种数据库:MySQL, PostgreSQL, SQLite等
  2. 使用Go代码编写迁移脚本
  3. 维护迁移历史表
  4. 支持迁移回滚
  5. 简单的API接口

安装

go get github.com/GuiaBolso/darwin

基本使用示例

1. 初始化Darwin和数据库连接

package main

import (
	"database/sql"
	"fmt"
	"log"

	"github.com/GuiaBolso/darwin"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	// 初始化数据库连接
	db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 创建Darwin实例
	driver := darwin.NewGenericDriver(db, darwin.MySQLDialect{})

	d := darwin.New(driver, migrations, nil)

	// 执行迁移
	if err := d.Migrate(); err != nil {
		fmt.Println("Migration failed:", err)
	}
}

// 定义迁移集合
var migrations = []darwin.Migration{
	{
		Version:     1,
		Description: "Creating table users",
		Script: `
			CREATE TABLE users (
				id INT AUTO_INCREMENT PRIMARY KEY,
				name VARCHAR(255) NOT NULL,
				email VARCHAR(255) NOT NULL UNIQUE,
				created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
			);
		`,
	},
	{
		Version:     2,
		Description: "Adding age column to users",
		Script: `
			ALTER TABLE users 
			ADD COLUMN age INT DEFAULT 0;
		`,
	},
}

2. 使用Go函数作为迁移脚本

除了SQL语句,Darwin也支持使用Go函数作为迁移脚本:

var migrations = []darwin.Migration{
	{
		Version:     1,
		Description: "Creating table products",
		Up: func(driver darwin.Driver) error {
			_, err := driver.Exec(`
				CREATE TABLE products (
					id INT AUTO_INCREMENT PRIMARY KEY,
					name VARCHAR(255) NOT NULL,
					price DECIMAL(10,2) NOT NULL
				);
			`)
			return err
		},
		Down: func(driver darwin.Driver) error {
			_, err := driver.Exec(`DROP TABLE products;`)
			return err
		},
	},
}

3. 检查迁移状态

// 获取已应用的迁移
applied, err := d.AppliedMigrations()
if err != nil {
	log.Fatal(err)
}

fmt.Println("Applied migrations:")
for _, m := range applied {
	fmt.Printf("Version: %d, Description: %s, Applied at: %v\n", 
		m.Version, m.Description, m.AppliedAt)
}

4. 自定义迁移表名

默认情况下,Darwin使用darwin_migrations表来跟踪迁移历史。你可以自定义这个表名:

driver := darwin.NewGenericDriver(db, darwin.MySQLDialect{})
driver.SetTableName("custom_migrations_table")

d := darwin.New(driver, migrations, nil)

高级用法

1. 使用事务

var migrations = []darwin.Migration{
	{
		Version:     3,
		Description: "Transaction example",
		Up: func(driver darwin.Driver) error {
			tx, err := driver.Begin()
			if err != nil {
				return err
			}
			
			// 执行多个SQL语句
			if _, err := tx.Exec(`INSERT INTO users (name, email) VALUES (?, ?)`, "Alice", "alice@example.com"); err != nil {
				tx.Rollback()
				return err
			}
			
			if _, err := tx.Exec(`UPDATE products SET price = price * 1.1`); err != nil {
				tx.Rollback()
				return err
			}
			
			return tx.Commit()
		},
	},
}

2. 使用Logger

Darwin允许你传入自定义logger来记录迁移过程:

type myLogger struct{}

func (l myLogger) Printf(format string, args ...interface{}) {
	log.Printf("[DARWIN] "+format, args...)
}

func main() {
	// ... 初始化db和driver ...
	
	d := darwin.New(driver, migrations, myLogger{})
	
	// ... 执行迁移 ...
}

注意事项

  1. 迁移是按版本号顺序执行的,确保版本号递增
  2. 一旦迁移被应用,就不应该修改它
  3. 在生产环境使用前,先在开发环境测试所有迁移
  4. 考虑在迁移脚本中添加错误处理和回滚逻辑

Darwin是一个简单但功能强大的数据库迁移工具,特别适合Go项目中使用。它避免了XML或JSON配置文件的复杂性,直接使用Go代码来定义迁移,使得迁移脚本更加灵活和强大。

回到顶部