根本原因是 Buffalo 运行时不读 config/database.yml,只依赖 DB_URL 环境变量或 models.NewDB() 返回的有效连接串;未导出 DB_URL 或 NewDB() 返回 nil 会导致 connection refused 或 panic: connection is nil。

buffalo db create 为什么报 connection refused
根本原因不是命令写错了,而是 Buffalo 运行时压根没连上数据库——buffalo db create 不读 config/database.yml,它只认 DB_URL 环境变量或 models.NewDB() 里硬编码的连接串。
- 执行前必须确保
DB_URL已导出,例如:export DB_URL="postgres://postgres:pass@localhost:5432/myapp_development?sslmode=disable" - 如果用 Docker Compose,得在 service 的
environment里显式写DB_URL=...,不能只配database.yml -
buffalo db create会尝试建库,但不会自动建用户或改权限;若 PostgreSQL 用户无 CREATEDB 权限,会报permission denied to create database
buffalo db migrate 总是 panic: connection is nil
这不是迁移命令本身的问题,而是 models.DB 没初始化成功。Pop 的连接实例必须在 buffalo db 命令运行前就准备好,否则 CLI 无法拿到有效连接。
- 检查
models/models.go中NewDB()是否返回了非 nil 的*pop.Connection - 确认
go mod tidy已执行:缺失github.com/gobuffalo/pop/v6会导致NewDB()编译失败或静默返回 nil - 别在
NewDB()里用os.Getenv("DATABASE_URL")却忘了导出该变量——buffalo db命令不加载.env文件,必须靠 shell 环境变量
如何让 buffalo db 命令支持 MySQL 或 SQLite
buffalo db 本身不决定数据库类型,它只是调用 Pop 的底层驱动。真正起作用的是你传给 pop.NewConnection() 的连接字符串协议头,以及是否已导入对应驱动。
- PostgreSQL:连接串以
postgres://开头,需确保go.mod包含github.com/lib/pq - MySQL:连接串用
mysql://,且go.mod必须有github.com/go-sql-driver/mysql - SQLite:连接串为
sqlite3://./development.sqlite,注意路径是相对项目根目录,且需github.com/mattn/go-sqlite3 - 所有驱动都必须在
models/models.go的init()函数中显式导入(如_ "github.com/mattn/go-sqlite3"),否则pop.NewConnection会返回sql: unknown driver "sqlite3"
buffalo db migrate -e production 报错连错库
环境参数 -e production 不会自动切换配置源,它只影响 Pop 加载 migration 文件的路径(比如找 ./migrations/production/),但数据库连接仍走同一套逻辑。
- 别依赖
database.yml的production区块——它不被读取 - 生产环境务必用
DB_URL显式指定连接串,且在运行命令前设置:DB_URL="mysql://user:pass@prod-db:3306/myapp_prod" buffalo db migrate -e production - 如果用了
buffalo build打包二进制,DB_URL必须在部署机器上设好,不能写死在代码里(尤其密码)


















