63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package model
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"errors"
|
||
"fmt"
|
||
"os"
|
||
"path/filepath"
|
||
"time"
|
||
|
||
"gin_test/config"
|
||
|
||
_ "modernc.org/sqlite"
|
||
)
|
||
|
||
func OpenDB(cfg config.DBConfig) (*sql.DB, error) {
|
||
if cfg.Driver == "" {
|
||
return nil, errors.New("db.driver is empty")
|
||
}
|
||
if cfg.DSN == "" {
|
||
return nil, errors.New("db.dsn is empty")
|
||
}
|
||
|
||
// 本 demo 只实现 sqlite;其他 driver 后续可以扩展。
|
||
switch cfg.Driver {
|
||
case "sqlite":
|
||
// modernc sqlite driver name 是 "sqlite"
|
||
db, err := sql.Open("sqlite", cfg.DSN)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
db.SetMaxOpenConns(cfg.MaxOpenConns)
|
||
db.SetMaxIdleConns(cfg.MaxIdleConns)
|
||
db.SetConnMaxLifetime(time.Duration(cfg.ConnMaxLifetimeSeconds) * time.Second)
|
||
|
||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||
defer cancel()
|
||
if err := db.PingContext(ctx); err != nil {
|
||
_ = db.Close()
|
||
return nil, err
|
||
}
|
||
|
||
return db, nil
|
||
default:
|
||
return nil, fmt.Errorf("unsupported db.driver: %s", cfg.Driver)
|
||
}
|
||
}
|
||
|
||
func Migrate(ctx context.Context, db *sql.DB) error {
|
||
schemaPath := filepath.Join("model", "schema.sql")
|
||
raw, err := os.ReadFile(schemaPath)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// sqlite 驱动会把这类多语句脚本当作一段执行(示例中只有 CREATE TABLE)。
|
||
_, err = db.ExecContext(ctx, string(raw))
|
||
return err
|
||
}
|
||
|