package db import ( "context" "fmt" "strings" "github.com/glebarez/sqlite" "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/gorm" ) func New(ctx context.Context, uri string) (*Client, error) { parts := strings.SplitN(uri, "::", 2) if len(parts) != 2 { return nil, fmt.Errorf("db.Init: opt db uri invalid: %s", uri) } c := &Client{} var ( err error dsn = parts[1] ) switch parts[0] { case "sqlite": c.dbType = DBTypeSqlite c.cli, err = gorm.Open(sqlite.Open(dsn)) case "mysql": c.dbType = DBTypeMysql c.cli, err = gorm.Open(mysql.Open(dsn)) case "postgres": c.dbType = DBTypePostgres c.cli, err = gorm.Open(postgres.Open(dsn)) default: return nil, fmt.Errorf("db type only support: [sqlite, mysql, postgres], unsupported db type: %s", parts[0]) } if err != nil { return nil, fmt.Errorf("db.Init: open %s with dsn:%s, err: %w", parts[0], dsn, err) } return c, nil } func Init(ctx context.Context, uri string) (err error) { if Default, err = New(ctx, uri); err != nil { return err } return nil }