数据库

Zeus 提供 database 包作为薄封装 stdlib 抽象,不做 ORM(用户可自由选 sqlx / gorm / ent / sqlc)。

核心概念

概念说明
DB / Tx / Rows / Row薄接口,签名几乎对齐 *sql.DB(学习成本零)
DBOptions连接池配置(Driver/DSN/MaxOpenConns/…)
TxOption事务选项(WithIsolation / WithReadOnly)
WithTx/FromTx同进程事务传播(多个 Repository 共享 Tx)
WithTxID/TxIDFromContext/EnsureTxID跨服务 tx_id 传播(审计/排查用,不做 2PC
database/sql内置实现:薄封装 stdlib *sql.DB + 自动 trace/metrics/tx_id
DatabaseComponentcomponents 适配器:OnStart Ping,OnStop Close

自动集成矩阵

每次 Query/Exec 触发:

集成行为
tracespan db.query/db.exec/db.tx.begin/db.tx.commit/db.tx.rollback;attrs: db, query, tx_id
metricscounter db_query_total{db,op,status} + histogram db_query_duration{db,op}
propagationEnsureTxID 自动写入 Bag{zeus.tx.id},随 client/server 跨服务透传

使用方式

 1import (
 2    "github.com/go-zeus/zeus/database"
 3    sqldriver "github.com/go-zeus/zeus/database/sql"
 4    _ "github.com/go-sql-driver/mysql"  // 注册驱动
 5)
 6
 7db, _ := sqldriver.New(database.DBOptions{
 8    Driver: "mysql",
 9    DSN:    "user:pass@tcp(127.0.0.1:3306)/db",
10    MaxOpenConns: 50,
11}, tracer, meter)
12
13// 单条操作
14rows, _ := db.Query(ctx, "SELECT id, name FROM users WHERE age > ?", 18)
15
16// 事务(同进程 tx 传播 + 自动 tx_id)
17tx, _ := db.BeginTx(ctx)
18ctx = database.WithTx(ctx, tx)
19// repoA / repoB 内部 FromTx(ctx) 优先取事务句柄
20_ = tx.Commit()
21
22// 跨服务:tx_id 自动透传到下游(client 自动注入到 Baggage)
23ctx = database.WithTxID(ctx, "biz-tx-001")

接入真实驱动

内置 database/sql 已满足单进程零依赖场景。分布式部署走 plugins:

1import (
2    "github.com/go-zeus/zeus/database"
3    mysql "github.com/go-zeus/zeus/plugins/database/mysql"
4)
5
6db, err := mysql.New(database.DBOptions{
7    DSN:         mysql.BuildDSN("root", "pass", "127.0.0.1", mysql.DefaultPort, "test"),
8    MaxOpenConns: 50,
9}, tracer, meter)

完整示例参见 examples/13-database/:建表/插入/查询/事务/tx_id 透传(用 fake driver,无需真实 DB)。