feat: 建立 MySQL 8 数据库基础 (#78)

This commit is contained in:
chengma
2026-08-10 01:22:22 +08:00
parent 93bbca88a8
commit 7e74bf210d
12 changed files with 623 additions and 41 deletions
+25 -12
View File
@@ -13,13 +13,12 @@
|---|---|---|
| Go | **1.23.0** | `go version` 输出 `go version go1.23.0 windows/amd64` |
| Git | 任意较新版本 | `git --version` 有输出 |
| DB Browser for SQLite | 任意 | 用来看数据库,可选但强烈建议装 |
| MySQL Client | 8.4 | 用于连接独立的 MySQL 8.4 开发/测试库 |
版本已定为 **go1.23.0**,写在 `admin/go.mod` 里。低于这个版本可能编译不过。
**不需要装 gcc。** 本项目的 SQLite 驱动是纯 Go 实现的
(`modernc.org/sqlite`),不依赖 cgo,这也是选它的原因——
`go build` 直接出单个 exe,不用配 C 编译器。
**不需要装 gcc。** 生产 MySQL 驱动和历史 SQLite 迁移驱动都是纯 Go;
`go build` 不依赖 C 编译器。
## 2. 拉依赖
@@ -47,6 +46,7 @@ go mod download
```powershell
go get github.com/gin-gonic/gin@v1.11.0
go get modernc.org/sqlite@v1.38.0
go get github.com/go-sql-driver/mysql@v1.9.2
go mod tidy
```
@@ -57,13 +57,13 @@ go mod tidy
go get github.com/xuri/excelize/v2@v2.9.1
```
这三个是**在 Go 1.23.0 下实测能编译通过的最高版本**,
这些是在 Go 1.23.0 下实测能编译通过的固定版本,
为什么不能更高见 [admin/AGENTS.md](../../admin/AGENTS.md) 技术栈一节。
`[必须]` `go.mod` 和 `go.sum` 都要提交 Git,否则别人拉下来版本对不上。
> SQLite 驱动**不要**换成 `mattn/go-sqlite3`,那个需要 cgo,
> 得装 gcc,还会让 `go build` 出不了单文件 exe。
> `go-sql-driver/mysql` v1.9.3 起要求 Go 1.24,本项目固定 v1.9.2。
> SQLite 驱动只用于历史库迁移,仍不要换成需要 cgo 的 `mattn/go-sqlite3`。
## 3. 跑起来
@@ -157,21 +157,34 @@ syb:
| `database is locked` | 有别的程序占着数据库 | 关掉 DB Browser 再试;程序运行时只读打开是可以的 |
| 导入 Excel 报错但没说哪一行 | 解析器没带行号 | 这是 bug,报错必须带行号,见 [06](06-quality-security.md) §2 |
## 6. 数据库在哪、怎么看
## 6. 数据库在哪里、怎样配置
跟 Client 一样是**便携模式**——数据都在程序旁边的 `data/` 里:
生产数据在 MySQL 8.4 中。Admin 从环境变量读取连接信息:
```text
CMAUTOBUY_DB_HOST=127.0.0.1
CMAUTOBUY_DB_PORT=3307
CMAUTOBUY_DB_NAME=<独立数据库名>
CMAUTOBUY_DB_USER=<最小权限账号>
CMAUTOBUY_DB_PASSWORD=<只保存在服务器环境文件中的密码>
```
密码不得写入 `config.yaml`、仓库、日志或工单。线上 MySQL 只监听本机,
本地开发通过 SSH 隧道连接独立的 `_test` 数据库。
程序旁边的 `data/` 只保留日志、上传文件和迁移前的 SQLite 只读备份:
```text
admin/data/
├── admin.db 数据库
├── backup/ 迁移前的 admin.db 只读备份
├── logs/ 运行日志
└── uploads/ 上传的 Excel 原件
```
跑源码时在 `admin\data\`;将来打包成 exe 后,在 exe 旁边。
用 **DB Browser for SQLite** 打开 `admin.db` 就能看数据。
每张表什么意思见 [03 数据模型](03-data-model.md)。
每张表什么意思见 [03 数据模型](03-data-model.md)。旧 `admin.db` 只能通过
单向迁移命令读取,生产 Admin 不再直接打开它。
> 写代码时**不要自己拼这个路径**,用统一的 `DataDir()` 函数,
> 见 [02 架构](02-architecture.md) §6。