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 }