最简路径是用 gorm.io/driver/sqlite 驱动配合文件路径 dsn(如 "./app.db")调用 gorm.open,必须配 &gorm.config{skipdefaulttransaction: true} 并显式 automigrate 才能正确建表运行。

直接用 gorm.Open 连 SQLite 是最简路径,但必须用对驱动、路径和配置项,否则会卡在“文件不存在”或“no such table”上。
用 gorm.io/driver/sqlite 而不是旧版 github.com/jinzhu/gorm
新版 GORM(v2)已弃用 jinzhu 组织下的包,必须用官方维护的驱动:
- 安装命令是
go get -u gorm.io/driver/sqlite,不是github.com/jinzhu/gorm/dialects/sqlite - 导入语句写成
import "gorm.io/driver/sqlite",不是_ "github.com/jinzhu/gorm/dialects/sqlite" - 旧驱动不支持 v2 的
gorm.Config参数结构,强行混用会导致编译失败或 panic
dsn 必须是文件路径,且目录需可写
SQLite 的 DSN 就是数据库文件路径,不是 URL 格式。常见错误包括:
- 写成
sqlite3://test.db或sqlite3:test.db→ 报错failed to open database: no such file or directory - 路径含相对路径如
./data/app.db,但当前工作目录不是项目根 → 文件实际创建在错误位置 - 路径所在目录不存在或无写权限(尤其 macOS/Linux 下的
/tmp或 Windows 的C:\Program Files\)→permission denied
推荐写法:"./app.db"(确保 . 可写),或绝对路径如 "/tmp/myapp.db"。
初始化时加 &gorm.Config{SkipDefaultTransaction: true}
SQLite 默认开启事务模式,而某些嵌入场景(比如 CLI 工具、单元测试)不需要自动事务包裹,否则容易触发 database is locked 错误:
-
SkipDefaultTransaction: true关闭写操作的隐式事务封装,让每个Create/Save直接执行 - 若需事务控制,显式用
db.Transaction(func(tx *gorm.DB) error { ... }) - 不加这个配置,在并发写或快速连续调用时,SQLite 的 WAL 模式可能来不及释放锁
完整连接示例:
db, err := gorm.Open(sqlite.Open("./app.db"), &gorm.Config{
SkipDefaultTransaction: true,
})
if err != nil {
panic(err)
}
第一次运行记得 AutoMigrate,否则表不存在
SQLite 不像 MySQL 那样有独立的数据库实例;.db 文件本身即数据库。但表不会自动创建:
- 只调用
gorm.Open不会建表,也不会报错 —— 它只是打开文件句柄 - 执行
db.AutoMigrate(&User{})才真正生成users表(含主键、时间戳字段等) - 如果结构体字段名含大写字母(如
UserName),默认映射为下划线命名(user_name),无需额外 tag,除非你用gorm:"column:..."
注意:SQLite 不支持 ALTER COLUMN,所以后续改字段类型或加 NOT NULL 约束,AutoMigrate 不会生效,得手动 db.Migrator().AddColumn 或重建表。
最关键的细节是:SQLite 连接不校验数据库是否存在,只校验路径是否可读写;表是否存在、字段是否匹配,要到第一次查询或迁移时才暴露 —— 别在 Open 后就认为万事大吉。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











