snapshot of https://github.com/ent/ent.git (master, 2026-09-15; blobs > 131072B omitted)
This commit is contained in:
152
doc/md/sql-integration.md
Normal file
152
doc/md/sql-integration.md
Normal file
@@ -0,0 +1,152 @@
|
||||
---
|
||||
id: sql-integration
|
||||
title: sql.DB Integration
|
||||
---
|
||||
|
||||
The following examples show how to pass a custom `sql.DB` object to `ent.Client`.
|
||||
|
||||
## Configure `sql.DB`
|
||||
|
||||
First option:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"<your_project>/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
)
|
||||
|
||||
func Open() (*ent.Client, error) {
|
||||
drv, err := sql.Open("mysql", "<mysql-dsn>")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Get the underlying sql.DB object of the driver.
|
||||
db := drv.DB()
|
||||
db.SetMaxIdleConns(10)
|
||||
db.SetMaxOpenConns(100)
|
||||
db.SetConnMaxLifetime(time.Hour)
|
||||
return ent.NewClient(ent.Driver(drv)), nil
|
||||
}
|
||||
```
|
||||
|
||||
Second option:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"time"
|
||||
|
||||
"<your_project>/ent"
|
||||
entsql "entgo.io/ent/dialect/sql"
|
||||
)
|
||||
|
||||
func Open() (*ent.Client, error) {
|
||||
db, err := sql.Open("mysql", "<mysql-dsn>")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
db.SetMaxIdleConns(10)
|
||||
db.SetMaxOpenConns(100)
|
||||
db.SetConnMaxLifetime(time.Hour)
|
||||
// Create an ent.Driver from `db`.
|
||||
drv := entsql.OpenDB("mysql", db)
|
||||
return ent.NewClient(ent.Driver(drv)), nil
|
||||
}
|
||||
```
|
||||
|
||||
## Use Opencensus With MySQL
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"database/sql/driver"
|
||||
|
||||
"<project>/ent"
|
||||
|
||||
"contrib.go.opencensus.io/integrations/ocsql"
|
||||
"entgo.io/ent/dialect"
|
||||
entsql "entgo.io/ent/dialect/sql"
|
||||
"github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
type connector struct {
|
||||
dsn string
|
||||
}
|
||||
|
||||
func (c connector) Connect(context.Context) (driver.Conn, error) {
|
||||
return c.Driver().Open(c.dsn)
|
||||
}
|
||||
|
||||
func (connector) Driver() driver.Driver {
|
||||
return ocsql.Wrap(
|
||||
mysql.MySQLDriver{},
|
||||
ocsql.WithAllTraceOptions(),
|
||||
ocsql.WithRowsClose(false),
|
||||
ocsql.WithRowsNext(false),
|
||||
ocsql.WithDisableErrSkip(true),
|
||||
)
|
||||
}
|
||||
|
||||
// Open new connection and start stats recorder.
|
||||
func Open(dsn string) *ent.Client {
|
||||
db := sql.OpenDB(connector{dsn})
|
||||
// Create an ent.Driver from `db`.
|
||||
drv := entsql.OpenDB(dialect.MySQL, db)
|
||||
return ent.NewClient(ent.Driver(drv))
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Use pgx with PostgreSQL
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"log"
|
||||
|
||||
"<project>/ent"
|
||||
|
||||
"entgo.io/ent/dialect"
|
||||
entsql "entgo.io/ent/dialect/sql"
|
||||
_ "github.com/jackc/pgx/v5/stdlib"
|
||||
)
|
||||
|
||||
// Open new connection
|
||||
func Open(databaseUrl string) *ent.Client {
|
||||
db, err := sql.Open("pgx", databaseUrl)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Create an ent.Driver from `db`.
|
||||
drv := entsql.OpenDB(dialect.Postgres, db)
|
||||
return ent.NewClient(ent.Driver(drv))
|
||||
}
|
||||
|
||||
func main() {
|
||||
client := Open("postgresql://user:password@127.0.0.1/database")
|
||||
|
||||
// Your code. For example:
|
||||
ctx := context.Background()
|
||||
if err := client.Schema.Create(ctx); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
users, err := client.User.Query().All(ctx)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Println(users)
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user