gin_demo/model/db.go
2026-03-27 10:42:46 +08:00

63 lines
1.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}