OOro

Multi Driver & Connections

Multiple database connections, default connection, read replicas, table prefix, and cross-connection relation loading.

Oro supports multiple named connections from the start. A query uses the default connection unless the model or query selects another one.

Configure connections

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

Default is used when a query does not specify a connection.

Model default connection

func (Order) Define(s *oro.SchemaBuilder) {
    s.Connection("orders")
    s.Table("orders")
}

db.Use[Order]() uses the model connection automatically.

Query connection override

orders, err := db.Connection("archive").Use[Order]().Get(ctx)

The override is scoped to the returned DB value.

Read replicas

Connections: map[string]oro.ConnectionConfig{
    "main": {
        Driver: sqlite.Open("primary.db"),
        Reads: []oro.Driver{
            sqlite.Open("replica-1.db"),
            sqlite.Open("replica-2.db"),
        },
    },
}

Reads can use replicas. Writes use the primary connection. Use UsePrimary() when a read must see just-written data.

Cross-connection preloading

With can load relations across model connections. Each relation query uses the related model’s configured connection unless overridden.

This keeps module boundaries clean, but cross-database consistency is still the application’s responsibility.

Table prefix

Builder-generated table names include the configured prefix. Raw SQL does not:

rows, err := db.Raw("select * from "+db.TableName("products")).Get(ctx)

Use db.TableName in raw SQL.

Edit this page