sqlite 连不上是因为 sql.open 不验证连接,必须调用 db.ping();cgo 驱动需安装 c 编译器和 sqlite 头文件(macos 用 brew install sqlite3,ubuntu 用 apt-get install libsqlite3-dev);路径、权限、驱动注册缺一不可。

Go 语言环境搭好了,SQLite 连不上?不是驱动没装,就是 sql.Open 返回的 db 没调 Ping() 验证——它只建连接池,不真正连数据库。
go get 安装 sqlite3 驱动时编译失败
常见错误是 gcc: command not found 或 sqlite3.h: no such file or directory。这是因为 github.com/mattn/go-sqlite3 是 CGO 驱动,依赖 C 编译器和 SQLite 头文件。
- macOS:运行
brew install sqlite3,再确保 Xcode 命令行工具已安装(xcode-select --install) - Ubuntu/Debian:执行
sudo apt-get install libsqlite3-dev build-essential - Windows:推荐用 MSYS2 或 WSL,原生 CMD/PowerShell 下容易缺
gcc和 pkg-config - 若想跳过 CGO,可用纯 Go 实现的
github.com/ziutek/mymysql替代方案(但 SQLite 功能受限),或改用gorm.io/driver/sqlite(它底层仍走 CGO,只是封装更友好)
sql.Open("sqlite3", "xxx.db") 后查询无反应或 panic
sql.Open 不会立即建立物理连接,只初始化连接池。如果路径写错、权限不足、或磁盘满,db.Query 或 db.Exec 才会暴露问题——而且报错可能模糊,比如 database is locked 或 no such table。
- 务必在
sql.Open后加db.Ping(),否则无法确认 DB 文件可读写 - 路径尽量用绝对路径或
filepath.Join(".", "data.db"),避免相对路径在不同工作目录下失效 - SQLite 默认以
0644权限创建文件,若程序以非 owner 身份运行(如 systemd 服务),需提前touch data.db & chmod 644 data.db - 并发写入频繁时,别省略
_ "github.com/mattn/go-sqlite3"的导入——它注册驱动,漏掉会导致sql: unknown driver "sqlite3"
用 GORM 连 SQLite 时迁移失败或表不存在
GORM 的 AutoMigrate 不会自动创建父目录,也不处理已有表结构变更(比如字段类型改了但没删库),且默认不启用外键约束。
- 确保数据库文件所在目录存在:
os.MkdirAll(filepath.Dir("db.sqlite"), 0755) - 显式启用外键:
db.Exec("PRAGMA foreign_keys = ON"),否则FOREIGN KEY定义无效 -
AutoMigrate只新增字段/索引,不修改或删除字段;要改结构,得手写db.Migrator().DropColumn或直接 SQLALTER TABLE - 如果模型 struct tag 里用了
gorm:"primaryKey"但没定义ID uint类型,GORM 会静默忽略主键,导致插入失败
SQLite 文件路径、CGO 环境、连接验证这三点漏掉任何一个,都会让“连上了”变成假象——它能编译、能启动,但第一条 INSERT 就卡住或报错。别信 sql.Open 的返回值,信 db.Ping() 的结果。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











