golang数据库工具包和CLI插件atlas的使用

Golang数据库工具包和CLI插件Atlas的使用

Atlas: 将数据库模式作为代码管理

Atlas是一个语言无关的工具,用于使用现代DevOps原则管理和迁移数据库模式。它提供两种工作流:

  • 声明式:类似于Terraform,Atlas比较数据库的当前状态与期望状态(定义在HCL、SQL或ORM模式中),并生成和执行迁移计划
  • 版本化:Atlas自动为您规划模式迁移,用户可以用HCL、SQL或他们选择的ORM描述期望的数据库模式

Atlas Logo

快速安装

macOS + Linux:

curl -sSf https://atlasgo.sh | sh

Homebrew:

brew install ariga/tap/atlas

Docker:

docker pull arigaio/atlas

NPM:

npx @ariga/atlas

主要功能

  • 模式管理atlas schema命令提供多种选项来检查、差异比较和修改数据库模式
  • 版本化迁移atlas migrate命令提供规划、检查和应用迁移的高级体验
  • Terraform支持:作为Terraform部署工作流的一部分管理数据库变更
  • SQL、HCL和ORM支持:支持使用HCL、SQL或ORM定义数据库模式
  • 多租户:内置对多租户数据库模式的支持
  • 云集成:与标准云服务集成,支持从AWS Secrets Manager和GCP Secret Manager读取密钥

schema inspect命令示例

检查MySQL模式并输出为HCL格式:

atlas schema inspect -u "mysql://root:pass@localhost:3306/example" > schema.hcl

检查整个MySQL数据库并输出为JSON格式:

atlas schema inspect \
  --url "mysql://root:pass@localhost:3306/" \
  --format '{{ json . }}' | jq

检查PostgreSQL模式并输出为SQL DDL语法:

atlas schema inspect \
  --url "postgres://root:pass@:5432/test?search_path=public&sslmode=disable" \
  --format '{{ sql . }}'

schema diff命令示例

比较两个MySQL模式:

atlas schema diff \
  --from mysql://root:pass@:3306/db1 \
  --to mysql://root:pass@:3306/db2

比较MySQL模式与迁移目录:

atlas schema diff \
  --from mysql://root:pass@:3306/db1 \
  --to file://migrations \
  --dev-url docker://mysql/8/db1

schema apply命令示例

将数据库更新到HCL模式定义的状态:

atlas schema apply \
  --url mysql://root:pass@:3306/db1 \
  --to file://schema.hcl \
  --dev-url docker://mysql/8/db1

migrate diff命令示例

创建迁移文件将数据库更新到HCL模式定义的状态:

atlas migrate diff add_blog_posts \           
  --dir file://migrations \
  --to file://schema.hcl \
  --dev-url docker://mysql/8/test

migrate apply命令示例

应用迁移目录中的所有待处理迁移文件:

atlas migrate apply \
  --url mysql://root:pass@:3306/db1 \
  --dir file://migrations

支持的数据库

MySQL、MariaDB、PostgreSQL、SQLite、TiDB、CockroachDB、SQL Server、ClickHouse、Redshift。

完整示例Demo

以下是一个完整的Golang项目中使用Atlas的示例:

  1. 首先安装Atlas CLI
  2. 创建HCL模式文件schema.hcl
table "users" {
  schema = schema.example
  column "id" {
    null = false
    type = int
  }
  column "name" {
    null = false
    type = varchar(100)
  }
  primary_key {
    columns = [column.id]
  }
}
  1. 创建迁移目录并生成迁移文件:
mkdir migrations
atlas migrate diff init \
  --dir file://migrations \
  --to file://schema.hcl \
  --dev-url docker://mysql/8/test
  1. 应用迁移:
atlas migrate apply \
  --url mysql://root:pass@:3306/test \
  --dir file://migrations
  1. 在Golang代码中使用Atlas客户端:
package main

import (
	"context"
	"log"
	
	"ariga.io/atlas/sql/migrate"
	"ariga.io/atlas/sql/mysql"
	"ariga.io/atlas/sql/sqlclient"
)

func main() {
	// 打开数据库连接
	client, err := sqlclient.Open(context.Background(), "mysql://root:pass@localhost:3306/test?parseTime=true")
	if err != nil {
		log.Fatalf("failed to open client: %v", err)
	}
	defer client.Close()
	
	// 创建迁移目录
	dir, err := migrate.NewLocalDir("migrations")
	if err != nil {
		log.Fatalf("failed to open migrations directory: %v", err)
	}
	
	// 获取迁移状态
	status, err := client.Status(context.Background(), dir)
	if err != nil {
		log.Fatalf("failed to get status: %v", err)
	}
	
	log.Printf("Current migration status: %v", status)
	
	// 应用所有待处理迁移
	err = client.Apply(context.Background(), dir)
	if err != nil {
		log.Fatalf("failed to apply migrations: %v", err)
	}
	
	log.Println("Migrations applied successfully")
}

这个示例展示了如何:

  1. 使用Atlas CLI创建和管理数据库迁移
  2. 在Golang项目中使用Atlas客户端库检查和应用迁移
  3. 使用HCL定义数据库模式

Atlas提供了强大的工具链来管理数据库模式的整个生命周期,从定义到部署,同时支持多种数据库后端。


更多关于golang数据库工具包和CLI插件atlas的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang数据库工具包和CLI插件atlas的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang数据库工具包与Atlas CLI使用指南

常用Golang数据库工具包

1. database/sql标准库

Go语言内置的标准数据库接口,支持多种数据库驱动。

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    // 查询示例
    rows, err := db.Query("SELECT id, name FROM users")
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()
    
    for rows.Next() {
        var id int
        var name string
        err = rows.Scan(&id, &name)
        // 处理数据
    }
}

2. GORM (ORM框架)

流行的ORM库,支持多种数据库。

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    gorm.Model
    Name string
    Age  int
}

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    
    // 自动迁移
    db.AutoMigrate(&User{})
    
    // 创建记录
    db.Create(&User{Name: "Alice", Age: 25})
    
    // 查询
    var user User
    db.First(&user, 1) // 查找ID为1的用户
}

3. sqlx

扩展标准库,提供更方便的数据绑定功能。

import (
    "github.com/jmoiron/sqlx"
    _ "github.com/go-sql-driver/mysql"
)

type User struct {
    ID   int    `db:"id"`
    Name string `db:"name"`
}

func main() {
    db, err := sqlx.Connect("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
    if err != nil {
        panic(err)
    }
    
    // 查询到结构体切片
    users := []User{}
    err = db.Select(&users, "SELECT id, name FROM users")
    if err != nil {
        panic(err)
    }
}

Atlas CLI使用指南

Atlas是一个现代化的数据库迁移和Schema管理工具,支持多种数据库。

安装Atlas

# 使用Homebrew (macOS/Linux)
brew install ariga/tap/atlas

# 使用Go安装
go get -u ariga.io/atlas/cmd/atlas

基本使用

  1. 初始化项目
mkdir myproject
cd myproject
atlas init --url mysql://user:pass[@localhost](/user/localhost):3306/dbname
  1. 创建迁移文件
atlas migrate diff create_users_table \
  --dir "file://migrations" \
  --to "file://schema.hcl" \
  --dev-url "docker://mysql/8/dev"
  1. 应用迁移
atlas migrate apply \
  --url mysql://user:pass[@localhost](/user/localhost):3306/dbname \
  --dir file://migrations

HCL Schema定义示例

schema "myapp" {
}

table "users" {
  schema = schema.myapp
  column "id" {
    type = int
    auto_increment = true
  }
  column "name" {
    type = varchar(100)
    null = false
  }
  column "email" {
    type = varchar(255)
    unique = true
  }
  primary_key {
    columns = [column.id]
  }
}

与Golang集成

Atlas提供了Go SDK,可以集成到应用中:

import (
    "context"
    "log"
    
    "ariga.io/atlas/sql/migrate"
    "ariga.io/atlas/sql/mysql"
    "ariga.io/atlas/sql/sqlclient"
)

func main() {
    // 创建客户端
    client, err := sqlclient.Open(context.Background(), "mysql://user:pass[@localhost](/user/localhost):3306/dbname")
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()
    
    // 创建迁移目录
    dir, err := migrate.NewLocalDir("migrations")
    if err != nil {
        log.Fatal(err)
    }
    
    // 应用迁移
    err = client.ApplyChanges(context.Background(), nil, dir)
    if err != nil {
        log.Fatal(err)
    }
}

高级功能

  1. 版本控制集成

    atlas migrate lint --dir file://migrations --dev-url docker://mysql/8/dev
    
  2. Schema检查

    atlas schema inspect -u mysql://user:pass[@localhost](/user/localhost):3306/dbname > schema.hcl
    
  3. CI/CD集成

    atlas migrate validate --dir file://migrations --dev-url docker://mysql/8/dev
    

Atlas提供了强大的数据库管理功能,特别适合需要严格Schema管理和团队协作的项目。

回到顶部