答案是方言错配:gorp 初始化时用了 gorp.MySQLDialect{} 却连接 SQLite 驱动,导致生成含 AUTO_INCREMENT 的非法 SQL;必须改用 gorp.SqliteDialect{} 并确保主键字段命名为 Id 或显式调用 SetKeys(true, "xxx")。

用 gorp 操作 SQLite 时出现 near "auto_increment": syntax error,基本就是方言(Dialect)配错了——不是驱动没装好,也不是 SQL 写得不对,而是 gorp 生成的建表语句用了 MySQL 的语法,却跑在 SQLite 上。
gorp 初始化时必须匹配 Dialect 和实际驱动
gorp 不自己连数据库,它依赖 database/sql 驱动,而 Dialect 决定它怎么生成 SQL。你 import _ "github.com/mattn/go-sqlite3",就得配 gorp.SqliteDialect{};如果误写成 gorp.MySQLDialect{},建表语句里就会冒出 SQLite 不认识的 AUTO_INCREMENT、ENGINE=InnoDB 等关键字。
- 检查你的
DbMap初始化代码,确认Dialect字段是gorp.SqliteDialect{},不是gorp.MySQLDialect{} - SQLite 驱动名是
sqlite3,MySQL 是mysql,二者不能混用 - 如果你同时支持多数据库,建议按驱动实例化不同
DbMap,而不是复用同一个
结构体主键字段名必须为 Id 或显式声明
gorp 对自增主键有默认约定:字段名必须叫 Id,类型为 int64 或 int。如果你的结构体字段叫 Identi 或 id(小写),它不会自动识别为主键,建表时就不会加 INTEGER PRIMARY KEY,插入时也得不到自增值。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 最简方案:把字段重命名为
Id int64 - 若不能改名,用
dbmap.AddTableWithName(&YourStruct{}, "your_table").SetKeys(true, "Identi")显式指定 - 注意:
SetKeys(true, ...)第一个参数为true表示该字段是自增的,SQLite 才会用INTEGER PRIMARY KEY
编译前确保 sqlite3 C 依赖已就绪
macOS 和 Linux 下,github.com/mattn/go-sqlite3 是 CGO 驱动,编译时需要本地有 pkg-config 和 SQLite3 开发头文件。Windows 默认用纯 Go 实现(sqlite3 的 libsqlite3 变体),但 macOS/Linux 容易卡在这一步。
立即学习“go语言免费学习笔记(深入)”;
- macOS:运行
brew install sqlite3 pkg-config - Ubuntu/Debian:
sudo apt-get install libsqlite3-dev pkg-config - 编译时加
CGO_ENABLED=1(默认开启),禁用 CGO 会导致驱动不可用 - 交叉编译到其他平台(如 Linux)时,目标系统也需具备对应头文件,否则
go build直接失败
方言错配的问题往往只在建表或首次迁移时暴露,一旦表结构建歪了,后续所有操作都可能失败且报错不直观。别急着查连接池或事务配置,先盯住 Dialect 和结构体字段命名这两处——它们才是最常被跳过的硬性条件。


















