PostgreSQL CI配置:golang-migrate/migrate集成
·
PostgreSQL CI配置:golang-migrate/migrate集成
背景与痛点
你是否还在手动执行数据库迁移脚本?团队协作中是否遇到过迁移顺序混乱、环境不一致的问题?本文将介绍如何通过GitHub Actions实现PostgreSQL数据库迁移的自动化,确保每次代码提交都能自动验证迁移脚本的正确性。
迁移脚本设计规范
基础迁移文件结构
PostgreSQL迁移脚本需遵循命名规范:{时间戳}_{描述}.up.sql(升级)和{时间戳}_{描述}.down.sql(回滚)。例如:
- 1085649617_create_users_table.up.sql
- 1185749658_add_city_to_users.up.sql
- 1285849751_add_index_on_user_emails.up.sql
典型迁移示例
创建用户表:
CREATE TABLE users (
user_id integer unique,
name varchar(40),
email varchar(40)
);
添加城市字段:
ALTER TABLE users ADD COLUMN city varchar(100);
添加邮箱索引:
CREATE UNIQUE INDEX CONCURRENTLY users_email_index ON users (email);
GitHub Actions工作流配置
基础配置文件
在项目根目录创建 .github/workflows/postgres-migrate.yml:
name: PostgreSQL Migration Test
on: [push, pull_request]
jobs:
migrate-test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:14
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: example
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
- name: Install migrate CLI
run: go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
- name: Run migrations
run: |
export POSTGRESQL_URL='postgres://postgres:password@localhost:5432/example?sslmode=disable'
migrate -database ${POSTGRESQL_URL} -path database/postgres/examples/migrations up
- name: Verify migration
run: |
psql -h localhost -U postgres -d example -c "\d users"
关键配置说明
- PostgreSQL服务:使用Docker容器提供数据库环境,设置健康检查确保服务就绪
- 迁移工具安装:通过
go install安装migrate CLI,启用postgres标签 - 数据库连接:使用环境变量配置连接URL,包含认证信息和SSL设置
- 迁移执行:调用
migrate up命令应用所有未执行的迁移脚本 - 结果验证:通过psql命令检查表结构是否符合预期
常见问题解决方案
迁移脚本幂等性
确保脚本可重复执行,使用IF EXISTS/IF NOT EXISTS关键字:
CREATE TABLE IF NOT EXISTS users (...);
DROP TABLE IF EXISTS users;
事务管理
复杂迁移需使用事务包装,确保原子性:
BEGIN;
CREATE TYPE enum_mood AS ENUM ('happy', 'sad', 'neutral');
ALTER TABLE users ADD COLUMN mood enum_mood;
COMMIT;
搜索路径问题
当schema与用户名相同时,需显式指定search_path:
export POSTGRESQL_URL='postgres://postgres:password@localhost:5432/example?sslmode=disable&search_path=public'
本地开发与CI一致性
为确保本地开发与CI环境一致,建议使用Docker Compose:
version: '3'
services:
postgres:
image: postgres:14
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: example
ports:
- "5432:5432"
运行命令:
docker-compose up -d
export POSTGRESQL_URL='postgres://postgres:password@localhost:5432/example?sslmode=disable'
migrate -database ${POSTGRESQL_URL} -path database/postgres/examples/migrations up
总结与最佳实践
- 版本控制:所有迁移脚本纳入Git管理,禁止直接修改已提交的脚本
- 测试覆盖:为每个迁移编写单元测试,验证升级/回滚逻辑
- 渐进部署:生产环境建议分阶段执行迁移,监控性能影响
- 文档维护:在每个脚本头部添加变更说明,记录设计决策
通过本文配置,团队可实现PostgreSQL迁移的自动化验证,减少人工操作错误,提高开发效率。完整示例可参考项目中的PostgreSQL教程。
点赞+收藏本文,关注后续《高级迁移策略:蓝绿部署与数据一致性》教程!
更多推荐

所有评论(0)