buffalo 默认不内置 mysql 驱动,需在 models/models.go 中 import _ "github.com/go-sql-driver/mysql" 并在 database.yml 中设 dialect: "mysql" 且 url 包含 parsetime=true,否则启动 panic: unknown driver "mysql"。

Buffalo 默认不内置 MySQL 驱动,直接在 database.yml 里写 dialect: "mysql" 会报错:找不到驱动 —— 这是新手最常卡住的第一步。
为什么 buffalo dev 启动就 panic: unknown driver "mysql"
Buffalo 的 pop(数据库层)默认只加载 postgres 和 sqlite3 驱动。MySQL 需要显式导入并注册驱动,否则 pop.Open() 会因未注册而失败。
- 错误现象:
panic: unknown driver "mysql"或sql: unknown driver "mysql" (forgotten import?) - 根本原因:Go 的
database/sql机制要求驱动必须被_匿名导入才能注册到全局驱动列表 - Buffalo 项目中,驱动导入通常发生在
models/models.go或actions/app.go的 init 块之前
正确导入 MySQL 驱动的两处关键位置
必须同时满足两个条件,缺一不可:
- 在
models/models.go顶部添加:import _ "github.com/go-sql-driver/mysql" - 在
database.yml中把dialect改为mysql(不是mysqldb或go-mysql) - 连接串格式必须符合 MySQL 驱动要求:
user:password@tcp(host:port)/dbname?parseTime=true&loc=Local - 如果使用本地 MySQL 且端口是默认 3306,
tcp(localhost:3306)可简写为tcp(localhost),但不建议省略端口,避免歧义
database.yml 示例与常见配置陷阱
database.yml 不支持环境变量内插(如 ${DB_USER}),所有值必须硬编码或通过外部工具预处理。以下是可直接运行的 development 段落:
development: dialect: "mysql" database: "myapp_development" user: "root" password: "123456" host: "localhost" port: 3306 sslmode: false url: "root:123456@tcp(localhost:3306)/myapp_development?parseTime=true&loc=Local"
-
url字段优先级高于其他字段,只要它存在,pop 就忽略user/password等单独配置 -
parseTime=true是必须的,否则time.Time字段读取会失败或变成零值 -
loc=Local避免时区错乱,尤其当 MySQL server time_zone 是SYSTEM且系统时区非 UTC 时 - 密码含特殊字符(如
@、/)必须 URL 编码,例如pass@word→pass%40word
验证连接是否真正生效
仅靠 buffalo dev 不报错 ≠ 数据库连上了。真正验证要走迁移或查询:
- 运行
buffalo db create创建库(需 MySQL root 权限) - 运行
buffalo db migrate,若报Error 1146: Table 'myapp_development.schema_migrations' doesn't exist,说明连接通但库为空 —— 这是正常初始状态 - 在
actions/home.go里临时加一行:log.Printf("DB ping: %v", db.DB.Ping()),看日志是否输出nil - 注意:Buffalo 的
db变量是 lazy-init 的,首次调用db.Find()或db.All()才真正建连,所以光看启动日志没用
最容易被忽略的是 parseTime=true 和驱动匿名导入 —— 两者任一缺失,都会导致后续时间字段读写静默失败或 panic,而不是明确报连接错误。











