สอนการใช้ Go Migrate
1. ภาพรวมของ Go Migrate
Go Migrate เป็นเครื่องมือสำหรับการจัดการการโอนถ่ายฐานข้อมูลที่เขียนด้วยภาษา Go มันสามารถใช้งานได้เป็นอินเทอร์เฟซโปรแกรมคอมมานด์ไลน์ (CLI) หรือนำเข้าเป็นไลบรารีสำหรับโปรเจค Go Migrate สามารถอ่านไฟล์การโอนถ่ายจากแหล่งต่าง ๆ และนำมันไปปรับใช้กับฐานข้อมูลในลำดับที่ถูกต้อง มันรองรับหลายไดรเวอร์ฐานฐานข้อมูลและแหลงของการโอนถ่าย
2. เวอร์ชัน
Go Migrate รองรับหลายเวอร์ชัน รวมถึง:
- Master: เวอร์ชันล่าสุด รวมถึงคุณลักษณะใหม่และการแก้ไขข้อบกพร่อง
- v4: เวอร์ชันเสถียร หรือสำหรับการใช้งานที่เป็นพรอพชัน
- v3: ไม่ได้รับการสนับสนุนและไม่ควรใช้
3. การติดตั้ง
ในการใช้ Go Migrate คุณจำเป็นต้องติดตั้งแพ็คเกจของ Go รันคำสั่งต่อไปนี้เพื่อทำการติดตั้ง:
go get -u -d github.com/golang-migrate/migrate/v4
cd $GOPATH/src/github.com/golang-migrate/migrate/v4
3. การใช้ Go Migrate
Go Migrate สามารถใช้ผ่าน CLI หรือเป็นไลบรารีในโปรเจค Go
3.0 URL การเชื่อมต่อฐานข้อมูล
ไม่ว่าจะใช้ CLI หรือโค้ด Go คุณจำเป็นต้องกำหนด URL ของฐานข้อมูลสำหรับการเชื่อมต่อกับฐานข้อมูล
รูปแบบ URL:
dbdriver://username:password@host:port/dbname?param1=true¶m2=false
URL นี้เป็น URL การเชื่อมต่อกับฐานข้อมูลที่ใช้เชื่อมต่อกับฐานข้อมูลและระบุพารามิเตอร์การเชื่อมต่อ นี่คือการอธิบายสำหรับแต่ละส่วน:
-
dbdriver://
: นี่คือตัวระบุโปรโตคอลสำหรับไดรเวอร์ฐานข้อมูลที่ใช้เพื่อระบุว่าจะใช้ไดรเวอร์ฐานข้อมูลใด เช่น mysql -
username:password
: นี่คือชื่อผู้ใช้และรหัสผ่านที่ใช้สำหรับการออเธนติเคชัน โดยทั่วไปแล้วชื่อผู้ใช้และรหัสผ่านถูกแยกกันด้วยเครื่องหมายํ (:) -
@
: สัญลักษณ์นี้ใช้สำหรับแยกชื่อผู้ใช้และรหัสผ่านจากโฮสต์เนมและพอร์ต -
host:port
: นี้คือชื่อโฮสต์และหมายเลขพอร์ตของเซิร์ฟเวอร์ฐานข้อมูล ชื่อโฮสต์คือที่อยู่ไอพีหรือชื่อโดเมนของเซิร์ฟเวอร์ฐานข้อมูลและหมายเลขพอร์ตคือพอร์ตที่เซิร์ฟเวอร์ฐานข้อมูลกำลังฟังอยู่ -
/dbname
: นี้คือชื่อฐานข้อมูลที่จะเชื่อมต่อ -
?param1=true¶m2=false
: ส่วนนี้คือพารามิเตอร์คิวรี่ที่ใช้สำหรับระบุพารามิเตอร์การเชื่อมต่อเพิ่มเติม ในตัวอย่างนี้มีพารามิเตอร์สองตัว
พารามิเตอร์คิวรี่เหล่านี้สามารถกำหนดตามความต้องการเฉพาะของไดรเวอร์ฐานข้อมูลและเซิร์ฟเวอร์ฐานข้อมูลเพื่อกำหนดคุณสมบัติหรือพฤติกรรมของการเชื่อมต่อเฉพาะ
พารามิเตอร์การเชื่อมต่อ Postgres
postgres://postgres:password@localhost:5432/example?sslmode=disable
พารามิเตอร์การเชื่อมต่อ SQLite
sqlite3://path/to/database?query
พารามิเตอร์การเชื่อมต่อ MongoDB
mongodb://user:password@host:port/dbname?query
3.1 การใช้งาน CLI
3.1.1 การใช้งานพื้นฐาน
เพื่อใช้ CLI ให้กระทำตามคำสั่งนี้:
migrate -source file://path/to/migrations -database postgres://localhost:5432/database up 2
คำสั่งนี้นำไฟล์การโอนถ่ายจากแหล่งที่ระบุไปยังฐานข้อมูลที่กำหนด ตัวเลข "2" แสดงถึงจำนวนการโอนถ่ายที่ต้องปรับใช้
3.1.2 การใช้งานด้วย Docker
Go Migrate ยังสามารถใช้งานร่วมกับ Docker ให้รันคำสั่งนี้:
docker run -v {{ migration dir }}:/migrations --network host migrate/migrate -path=/migrations/ -database postgres://localhost:5432/database up 2
คำสั่งนี้จะรัน Go Migrate ในคอนเทนเนอร์ Docker และนำไฟล์การโอนถ่ายจากแหล่งที่ระบุไปยังฐานข้อมูลที่กำหนด
3.2 การใช้ในโปรเจกต์ Go ของคุณ
ในการใช้ Go Migrate ในโปรเจกต์ Go ของคุณ คุณต้องนำเข้าแพ็กเกจและไลบรารีที่จำเป็น ตัวอย่างเช่น:
import (
"github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/github"
)
func main() {
m, err := migrate.New(
"github://mattes:personal-access-token@mattes/migrate_test",
"postgres://localhost:5432/database?sslmode=enable")
m.Steps(2)
}
โค้ดนี้จะเริ่มต้นใช้ Go Migrate ด้วยแหล่งที่ระบุและฐานข้อมูล จากนั้นนำไปใช้ 2 การโมเด็คด้วยวิธี Steps
หากต้องการใช้ไคลเอนต์ฐานข้อมูลที่มีอยู่ โปรดอ้างถึงตัวอย่างต่อไปนี้:
import (
"database/sql"
_ "github.com/lib/pq"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/file"
)
func main() {
db, err := sql.Open("postgres", "postgres://localhost:5432/database?sslmode=enable")
driver, err := postgres.WithInstance(db, &postgres.Config{})
m, err := migrate.NewWithDatabaseInstance(
"file:///migrations",
"postgres", driver)
m.Up()
}
โค้ดนี้จะนำเข้าแพ็กเกจที่จำเป็นและเริ่มต้นไคลเอนต์ฐานข้อมูลด้วยแพ็กเกจ sql
จากนั้นสร้าง Go Migrate ใหม่ด้วยวิธี NewWithDatabaseInstance
ระบุแหล่งที่มาและไดรเวอร์ฐานข้อมูล สุดท้ายนำไปใช้การโมเด็คด้วยวิธี Up
4. ไดรเวอร์ฐานข้อมูลที่รองรับ
Go Migrate รองรับไดรเวอร์ฐานข้อมูลหลายรูปแบบ รวมถึง:
- PostgreSQL
- PGX v4
- PGX v5
- Redshift
- Ql
- Cassandra
- SQLite
- SQLite3
- SQLCipher
- MySQL/MariaDB
- Neo4j
- MongoDB
- CrateDB
- Shell
- Google Cloud Spanner
- CockroachDB
- YugabyteDB
- ClickHouse
- Firebird
- MS SQL Server
5. แหล่งที่มาของการโมเด็ค
Go Migrate รองรับแหล่งที่มาของการโมเด็คหลายรูปแบบ รวมถึง:
- ระบบไฟล์: อ่านการโมเด็คจากระบบไฟล์ภายในเครื่อง
- io/fs: อ่านการโมเด็คโดยใช้แพ็กเกจ Go
io/fs
- Go-Bindata: อ่านการโมเด็คจากข้อมูลไบนารีที่ฝังอยู่โดยใช้แพ็กเกจ
jteeuwen/go-bindata
- pkger: อ่านการโมเด็คจากข้อมูลไบนารีที่ฝังอยู่โดยใช้แพ็กเกจ
markbates/pkger
- GitHub: อ่านการโมเด็คจากระบบรีโมท GitHub ระยะไกล
- GitHub Enterprise: อ่านการโมเด็คจากระบบรีโมท GitHub Enterprise ระยะไกล
- Bitbucket: อ่านการโมเด็คจากระบบรีโมท Bitbucket ระยะไกล
- Gitlab: อ่านการโมเด็คจากระบบรีโมท Gitlab ระยะไกล
- AWS S3: อ่านการโมเด็คจาก Amazon Web Services S3
- Google Cloud Storage: อ่านการโมเด็คจาก Google Cloud Platform Storage
ขึ้นอยู่กับความต้องการของโปรเจกต์ของคุณ คุณสามารถเก็บไฟล์การโมเด็คฐานข้อมูลได้ในแหล่งที่มาของการโมเด็คที่รองรับที่กล่าวถึงข้างต้น
6. ไฟล์การโมเด็ค
ไฟล์การโมเด็คใน Go Migrate มีรูปแบบชื่อไฟล์และเนื้อหาที่เฉพาะเจาะจง
6.1 รูปแบบชื่อไฟล์การโมเด็ค
แต่ละการโมเด็คประกอบด้วยไฟล์การโมเด็ค "up" และไฟล์การโมเด็ค "down" ที่สอดคล้องกับรูปแบบต่อไปนี้:
{เวอร์ชัน}_{ชื่อ}.up.{นามสกุล}
{เวอร์ชัน}_{ชื่อ}.down.{นามสกุล}
เวอร์ชัน
เป็นตัวเลขที่ไม่ซ้ำซ้อนที่แทนลำดับที่ต้องการทำการโมเด็ค ชื่อ
เป็นคำอธิบายทางลักษณะ (อาจมีหรือไม่มีก็ได้) นามสกุล
ขึ้นอยู่กับระบบฐานข้อมูลที่ใช้ (เช่นสำหรับระบบ SQL สาขา ใช้ .sql
)
6.2 รูปแบบเนื้อหาการโมเด็ค
เนื้อหาของไฟล์การโมเด็คมีลักษณะแตกต่างกันขึ้นอยู่กับระบบฐานข้อมูล โดยทั่วไปแล้วนั้นเกี่ยวข้องกับการเขียน SQL โดยตรง
ตัวอย่างเช่น นี่คือไฟล์การโมเด็คสองไฟล์:
- 000001_create_users_table.up.sql
- 000001_create_users_table.down.sql
ไฟล์การโมเด็ค 000001_create_users_table.up.sql
CREATE TABLE IF NOT EXISTS users(
user_id serial PRIMARY KEY,
username VARCHAR (50) UNIQUE NOT NULL,
password VARCHAR (50) NOT NULL,
email VARCHAR (300) UNIQUE NOT NULL
);
ไฟล์การโมเด็ค 000001_create_users_table.down.sql, ไฟล์ down ใช้เพื่อยกเลิกการดำเนินการก่อนหน้าโดยทั่วไปใช้เป็นวัตถุสำหรับการย้อนกลับ
DROP TABLE IF EXISTS users;
6.3 การทำให้ Migration สามารถย้อนกลับได้
การเขียนการทำให้ migration สามารถย้อนกลับได้ถือว่าเป็นการปฏิบัติที่ดีที่สุด ซึ่งหมายความว่าการทำ up และ down migration ต้องสามารถทำงานไปยังเวอร์ชันใดๆ โดยสามารถสร้างและทำควาวถับระบบฐานข้อมูลได้อย่างมีประสิทธิภาพ
เพื่อให้มั่นใจในการทำใให้สามารถย้อนกลับได้ ทุก migration ควรมีไฟล์ up และ down migration ที่สอดคล้องกัน ไฟล์ up migration มีการกระทำในการปรับใช้ migration ในขณะที่ไฟล์ down migration มีการกระทำในการย้อนกลับการ migration
7. การใช้งาน MySQL
Go Migrate รองรับการใช้งานกับฐานข้อมูล MySQL โดยเพื่อเชื่อมต่อกับฐานข้อมูล MySQL ให้ URL ของฐานข้อมูลอยู่ในรูปแบบดังนี้:
mysql://user:password@tcp(host:port)/dbname?query
URL สามารถรวมพารามิเตอร์คำถามเช่น ชื่อตาราง migration พารามิเตอร์ TLS ฯลฯ สำหรับรายการแสดงรายละเอียดเพิ่มเติมกรุณาดูที่ Go Migrate MySQL documentation.
7.1 พารามิเตอร์ของคิวรี่ URL
-
x-migrations-table
: ชื่อของตาราง migration -
x-no-lock
: ตั้งเป็นtrue
เพื่อข้ามคำสั่งGET_LOCK
/RELEASE_LOCK
มีประโยชน์สำหรับ MySQL เวอร์ชัน multi-master -
x-statement-timeout
: ยกเลิกการประมวลผลคำสั่งใดๆ ที่เกินจำนวนมิลลิวินาทีที่ระบุไว้ -
dbname
: ชื่อของฐานข้อมูลที่ต้องการเชื่อมต่อ -
user
: ผู้ใช้สำหรับล็อคอิน -
password
: รหัสผ่านของผู้ใช้ -
host
: เครื่องเซิร์ฟเวอร์ที่ต้องการเชื่อมต่อ -
port
: พอร์ตที่ต้องการผูก -
tls
: พารามิเตอร์การเชื่อมต่อการเข้ารหัส TLS/SSL -
x-tls-ca
: ตำแหน่งของไฟล์ CA (Certificate Authority) -
x-tls-cert
: ตำแหน่งของไฟล์ใบรับรองจากผู้ใช้ -
x-tls-key
: ตำแหน่งของไฟล์กุญแจส่วนตัว -
x-tls-insecure-skip-verify
: การใช้ SSL หรือไม่ใช้
7.2 การใช้กับไคลเอนต์ที่มีอยู่แล้ว
หากคุณต้องการใช้ Go Migrate กับไคลเอนต์ MySQL ที่มีอยู่แล้ว โปรดตรวจสอบว่าคุณใช้พารามิเตอร์ multiStatements=true
เมื่อสร้างไคลเอนต์ ตัวอย่างเช่น:
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/mysql"
_ "github.com/golang-migrate/migrate/v4/source/file"
)
func main() {
db, _ := sql.Open("mysql", "user:password@tcp(host:port)/dbname?multiStatements=true")
driver, _ := mysql.WithInstance(db, &mysql.Config{})
m, _ := migrate.NewWithDatabaseInstance(
"file:///migrations",
"mysql",
driver,
)
m.Steps(2)
}
โค้ดนี้นำเข้าแพ็กเกจที่จำเป็นสร้างไคลเอนต์ฐานข้อมูล MySQL และเข้าใช้ Go Migrate ด้วยตัวอย่างการ์ดด้านฐานข้อมูล จากนั้นนำมาใช้ migration 2 ครั้งโดยใช้เมธอด Steps