golang数据库工具包和CLI插件atlas的使用
Golang数据库工具包和CLI插件Atlas的使用
Atlas: 将数据库模式作为代码管理
Atlas是一个语言无关的工具,用于使用现代DevOps原则管理和迁移数据库模式。它提供两种工作流:
- 声明式:类似于Terraform,Atlas比较数据库的当前状态与期望状态(定义在HCL、SQL或ORM模式中),并生成和执行迁移计划
- 版本化:Atlas自动为您规划模式迁移,用户可以用HCL、SQL或他们选择的ORM描述期望的数据库模式
快速安装
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的示例:
- 首先安装Atlas CLI
- 创建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]
}
}
- 创建迁移目录并生成迁移文件:
mkdir migrations
atlas migrate diff init \
--dir file://migrations \
--to file://schema.hcl \
--dev-url docker://mysql/8/test
- 应用迁移:
atlas migrate apply \
--url mysql://root:pass@:3306/test \
--dir file://migrations
- 在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")
}
这个示例展示了如何:
- 使用Atlas CLI创建和管理数据库迁移
- 在Golang项目中使用Atlas客户端库检查和应用迁移
- 使用HCL定义数据库模式
Atlas提供了强大的工具链来管理数据库模式的整个生命周期,从定义到部署,同时支持多种数据库后端。
更多关于golang数据库工具包和CLI插件atlas的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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
基本使用
- 初始化项目
mkdir myproject
cd myproject
atlas init --url mysql://user:pass[@localhost](/user/localhost):3306/dbname
- 创建迁移文件
atlas migrate diff create_users_table \
--dir "file://migrations" \
--to "file://schema.hcl" \
--dev-url "docker://mysql/8/dev"
- 应用迁移
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)
}
}
高级功能
-
版本控制集成
atlas migrate lint --dir file://migrations --dev-url docker://mysql/8/dev
-
Schema检查
atlas schema inspect -u mysql://user:pass[@localhost](/user/localhost):3306/dbname > schema.hcl
-
CI/CD集成
atlas migrate validate --dir file://migrations --dev-url docker://mysql/8/dev
Atlas提供了强大的数据库管理功能,特别适合需要严格Schema管理和团队协作的项目。