Buffalo 的 buffalo db 命令仅支持 PostgreSQL(dialect: postgres)、MySQL(dialect: mysql)、SQL Server(dialect: sqlserver),不支持 SQLite;报 unknown dialect "sqlite3" 是因 pop v6+ 彻底移除 SQLite 驱动注册,database.yml 或 DATABASE_URL 中配置无效。

Buffalo 的 buffalo db 命令不是通用数据库 CLI,它只支持 PostgreSQL、MySQL、SQL Server 三种数据库,且对 dialect 名、连接参数、驱动注册有硬性要求;SQLite 完全不被支持,报 unknown dialect "sqlite3" 不是配置错误,而是 pop v6+ 彻底移除了 SQLite 驱动注册逻辑。
buffalo db create/migrate 总是报 unknown dialect "sqlite3"
这不是你写错了 database.yml,而是 pop v6+ 的 dialects/ 目录下压根没有 sqlite3.go 文件。即使你在代码里 import _ "github.com/mattn/go-sqlite3",pop 初始化时仍找不到 SqliteDialect 实现,直接 panic 或静默跳过。
-
database.yml中写dialect: sqlite3完全无效,buffalo db 命令会忽略该块 -
DATABASE_URL=sqlite3://./dev.sqlite同样绕不过,dialect 查找阶段就失败 - 常见现象:命令无输出、无报错、但数据库没创建;或启动时 panic:
driver: unknown driver "sqlite3" (forgotten import?)
哪些数据库能用 buffalo db 命令直接管理
仅限 pop 官方内置的三种:PostgreSQL、MySQL、SQL Server。dialect 名必须严格匹配,大小写、拼写、横线都不能错:
- PostgreSQL →
dialect: postgres(不是postgresql) - MySQL →
dialect: mysql(不是mariadb,也不接受mysql8等别名) - SQL Server →
dialect: sqlserver(全小写、无横线)
连接参数也必须合规:
- PostgreSQL 必须带
sslmode=disable(本地开发不加则常连不上) - MySQL 要显式加
parseTime=true,否则time.Time字段扫描失败 - SQL Server 不支持 Unix socket,
host必须是 IP 或域名,不能填localhost(某些驱动下会解析成 socket)
想用 buffalo db 管理 SQLite?别试了,换方案
降级到 pop v5 并 patch 驱动理论上可行,但不推荐——v5 已停止维护,且与 Buffalo v2.x 的 module 依赖冲突严重。实际项目中更可靠的做法是彻底绕开 buffalo db:
- 保留
buffalo db仅用于 PostgreSQL/MySQL 环境(如 CI) - SQLite 场景改用原生
database/sql+github.com/mattn/go-sqlite3,在app.go中用sql.Open("sqlite3", "./dev.sqlite")初始化全局*sql.DB - 迁移脚本单独写成 Go 文件(如
migrate/main.go),用conn.Exec("CREATE TABLE ...")手动执行,不走 pop 迁移链 - 若需模拟开发环境,可用
echo 'development:\n dialect: sqlite3\n database: ./test.db' > database.yml+ 手动运行迁移脚本,而非依赖buffalo db migrate
真正容易被忽略的是:buffalo db 的能力边界非常窄——它只管建库、跑迁移、回滚版本,不提供任何运行时查询能力,也不处理索引、导入、空值映射等业务逻辑。这些都得靠你自己写 SQL、调 pop.Connection 或引入其他工具。别把它当成 psql/mysql CLI 的替代品。


















