OOro

多驱动与连接

配置多连接、默认连接、读写分离、连接池、模型连接和跨连接预加载。

Oro 把所有数据库配置统一放在 Connections 下。没有额外的顶层 Driver,避免概念重复。

基础配置

db, err := oro.Open(oro.Config{
    Default: "main",
    Connections: map[string]oro.ConnectionConfig{
        "main": {
            Driver: sqlite.Open("app.db"),
        },
        "mysql": {
            Driver: mysql.Open(mysqlDSN),
        },
        "pgsql": {
            Driver: pgsql.Open(pgDSN),
        },
    },
})

未指定连接时使用 Default;如果 Default 为空,默认使用 "default"

具体 SQL driver 由应用引入

import (
    "github.com/duxweb/oro/driver/sqlite"
    _ "modernc.org/sqlite"
)

官方驱动包只提供方言、结构检查和 database/sql 包装,不主动注册具体 SQL driver。

DriverName

sqlite.Open("app.db", sqlite.DriverName("sqlite3"))

适合 SQLite 这种同一方言有多个 database/sql 实现的场景。

Wrap

sqlDB, err := sql.Open("sqlite3", "app.db")
driver := sqlite.Wrap(sqlDB, sqlite.OwnsDB(true))

当你需要自己配置连接、认证、插件、连接器或已有连接池时,使用 Wrap

连接池

db, err := oro.Open(oro.Config{
    Pool: oro.PoolConfig{
        MaxOpenConns:    20,
        MaxIdleConns:    10,
        ConnMaxLifetime: time.Hour,
        PingOnOpen:      true,
    },
    Connections: map[string]oro.ConnectionConfig{
        "main": {Driver: mysql.Open(primaryDSN)},
        "reporting": {
            Driver: pgsql.Open(reportingDSN),
            Pool: &oro.PoolConfig{MaxOpenConns: 5},
        },
    },
})

全局连接池配置应用到所有连接;单连接配置优先覆盖。

读写分离

Connections: map[string]oro.ConnectionConfig{
    "main": {
        Driver: mysql.Open(primaryDSN),
        Reads: []oro.Driver{
            mysql.Open(readDSN1),
            mysql.Open(readDSN2),
        },
    },
}

读查询可以走读库。写入、事务、锁和 UsePrimary() 强制走主库。

rows, err := db.Use[Product]().UsePrimary().Get(ctx)

模型级连接

func (Report) Define(s *oro.SchemaBuilder) {
    s.Connection("pgsql")
    s.Table("reports")
}

模型连接会成为 db.Use[Report]() 的默认连接。

查询级连接

rows, err := db.Connection("pgsql").Table("reports").Get(ctx)

查询级连接优先级最高。

跨连接关系

预加载允许关系目标在另一个连接上。Oro 会拆成多次查询,不生成跨库 join。跨连接写入建议放在应用层显式协调,不假装提供分布式事务。

编辑此页