66 lines
1.4 KiB
Go
Raw Normal View History

2024-07-11 16:37:26 +08:00
package db
import (
"context"
2024-07-11 16:37:26 +08:00
"fmt"
"strings"
2024-12-27 11:13:28 +08:00
"github.com/glebarez/sqlite"
2024-07-11 16:37:26 +08:00
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
2024-12-27 11:13:28 +08:00
const tip = `example:
for sqlite -> sqlite::<filepath>
sqlite::data.sqlite
sqlite::/data/data.db
for mysql -> mysql::<gorm_dsn>
mysql::user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local
for postgres -> postgres::<gorm_dsn>
postgres::host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai
`
func New(ctx context.Context, uri string) (*Client, error) {
parts := strings.SplitN(uri, "::", 2)
2024-07-11 16:37:26 +08:00
if len(parts) != 2 {
2024-12-27 11:13:28 +08:00
return nil, fmt.Errorf("db.Init: db uri invalid\n%s", tip)
2024-07-11 16:37:26 +08:00
}
2024-12-27 11:13:28 +08:00
c := &Client{}
2024-07-11 16:37:26 +08:00
var (
err error
dsn = parts[1]
2024-07-11 16:37:26 +08:00
)
switch parts[0] {
2024-07-11 16:37:26 +08:00
case "sqlite":
c.dbType = DBTypeSqlite
2024-12-27 11:13:28 +08:00
c.cli, err = gorm.Open(sqlite.Open(dsn))
2024-07-11 16:37:26 +08:00
case "mysql":
c.dbType = DBTypeMysql
c.cli, err = gorm.Open(mysql.Open(dsn))
2024-07-11 16:37:26 +08:00
case "postgres":
c.dbType = DBTypePostgres
c.cli, err = gorm.Open(postgres.Open(dsn))
2024-07-11 16:37:26 +08:00
default:
return nil, fmt.Errorf("db type only support: [sqlite, mysql, postgres], unsupported db type: %s", parts[0])
2024-07-11 16:37:26 +08:00
}
if err != nil {
return nil, fmt.Errorf("db.Init: open %s with dsn:%s, err: %w", parts[0], dsn, err)
}
return c, nil
}
2024-12-27 11:13:28 +08:00
func Init(ctx context.Context, uri string) (err error) {
if Default, err = New(ctx, uri); err != nil {
return err
2024-07-11 16:37:26 +08:00
}
return nil
}