0

0

如何使用Golang搭建本地数据库环境_便于数据开发和测试

P粉602998670

P粉602998670

发布时间:2026-01-09 17:58:03

|

192人浏览过

|

来源于php中文网

原创

用 docker run 启动 PostgreSQL 容器是最省事且接近生产环境的方式,需挂载卷持久化数据、暴露 5432 端口、设置密码,并推荐使用 pgx 连接池与 migrate 管理迁移。

如何使用golang搭建本地数据库环境_便于数据开发和测试

用 Docker 快速启动 PostgreSQL 本地实例

最省事、最接近生产环境的方式就是用 docker run 启一个 PostgreSQL 容器。它不污染宿主机,端口、数据目录、密码全可自定义,重启后数据还能持久化。

常见错误是直接运行但没挂载卷,容器一删数据就丢;或者忘了暴露 5432 端口,Go 程序连不上还报 dial tcp 127.0.0.1:5432: connect: connection refused

  • 用以下命令启动带持久化的实例:
    docker run -d \
      --name pg-local \
      -e POSTGRES_PASSWORD=mysecretpassword \
      -v $(pwd)/pgdata:/var/lib/postgresql/data \
      -p 5432:5432 \
      -d postgres:15-alpine
  • 连接字符串在 Go 里通常长这样:postgres://postgres:mysecretpassword@localhost:5432/postgres?sslmode=disable
  • 首次启动后,建议立刻进容器执行 psql -U postgres,手动建测试库(比如 CREATE DATABASE myapp_test;),避免 Go 程序启动时因库不存在 panic

Go 中用 database/sql + pgx 连接并做基本查询

别用纯 database/sqllib/pq(已归档),优先选 pgx —— 它原生支持 PostgreSQL 协议,性能更好,还自带连接池和上下文超时控制。

容易踩的坑是:开连接不设 MaxOpenConnsMaxIdleConns,压测时瞬间创建几百个连接把本地 PostgreSQL 撑爆;或忘记调 db.Ping() 验证连通性,等真正查数据才报错。

立即学习go语言免费学习笔记(深入)”;

TemPolor
TemPolor

AI音乐生成器,一键创作免版税音乐

下载
  • 安装驱动:go get github.com/jackc/pgx/v5/pgxpool
  • 初始化连接池示例:
    pool, err := pgxpool.New(context.Background(), "postgres://postgres:mysecretpassword@localhost:5432/myapp_test?sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    defer pool.Close()
    
    // 主动探测
    if err := pool.Ping(context.Background()); err != nil {
        log.Fatal("failed to ping db:", err)
    }
  • pgxpool 默认最大打开连接数是 4,开发时可临时调高:pool.Config().MaxConns = 20

用 migrate 工具管理 SQL 迁移脚本

手写 CREATE TABLE 然后复制粘贴到 psql 里,短期可行,长期必然混乱。必须用迁移工具——migrate CLI 是最轻量、Go 生态兼容最好的选择,支持 PostgreSQL、SQLite、MySQL。

典型问题是迁移文件命名不规范(比如叫 v1.sql),导致顺序错乱;或没配好 GOOSE_DRIVER / DBURL 环境变量,执行时报 no driver for go-sql-driver/mysql 类似错误,其实只是 URL 里写了 mysql:// 却没装对应驱动。

  • 安装 CLI:curl -L https://github.com/golang-migrate/migrate/releases/download/v4.15.2/migrate.linux-amd64.tar.gz | tar xvz(Mac/Win 换对应二进制)
  • 迁移文件按时间戳命名:202405201430_add_users_table.up.sql,内容就是标准 SQL
  • 执行迁移:migrate -path ./migrations -database "postgres://postgres:mysecretpassword@localhost:5432/myapp_test?sslmode=disable" up
  • Go 代码里也可嵌入调用:migrate.New("postgres://...", "file://./migrations"),但 CLI 足够日常使用

清理与重置:避免测试数据干扰下一次 run

本地开发中,每次跑集成测试前清空表比重建库更快;但若用 TRUNCATE 不加 CASCADE,外键约束会报错;若用 DROP DATABASE 又得先 SELECT pg_terminate_backend(pid) 杀连接,太重。

最稳的做法是:测试前用迁移回滚到初始状态(migrate down),再 up 一遍;或者直接在测试函数里用事务包裹,Begin() → 操作 → Rollback(),完全隔离。

  • 事务方式更轻量,适合单元测试:
    tx, err := db.Begin(context.Background())
    if err != nil {
        t.Fatal(err)
    }
    defer tx.Rollback(context.Background()) // 注意不是 defer tx.Rollback()
    
    _, err = tx.Exec(context.Background(), "INSERT INTO users(name) VALUES($1)", "test")
    if err != nil {
        t.Fatal(err)
    }
  • 如果非要用清空表,记得加级联:TRUNCATE TABLE users, posts CASCADE;
  • 别依赖 go test -count=1 自动重置——它只重跑函数,不重置数据库状态
PostgreSQL 容器的 pgdata 目录权限、pgx 的连接池生命周期、迁移文件的时间戳格式,这三处最容易在换机器或交接时出问题,动手前多看一眼日志输出。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 785人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号