github.com/goravel/framework@v1.13.9/database/gorm/dialector.go (about) 1 package gorm 2 3 import ( 4 "fmt" 5 6 "github.com/glebarez/sqlite" 7 "github.com/google/wire" 8 "gorm.io/driver/mysql" 9 "gorm.io/driver/postgres" 10 "gorm.io/driver/sqlserver" 11 "gorm.io/gorm" 12 13 "github.com/goravel/framework/contracts/config" 14 databasecontract "github.com/goravel/framework/contracts/database" 15 "github.com/goravel/framework/contracts/database/orm" 16 "github.com/goravel/framework/database/db" 17 ) 18 19 var DialectorSet = wire.NewSet(NewDialectorImpl, wire.Bind(new(Dialector), new(*DialectorImpl))) 20 var _ Dialector = &DialectorImpl{} 21 22 type Dialector interface { 23 Make(configs []databasecontract.Config) ([]gorm.Dialector, error) 24 } 25 26 type DialectorImpl struct { 27 config config.Config 28 connection string 29 dsn db.Dsn 30 } 31 32 func NewDialectorImpl(config config.Config, connection string) *DialectorImpl { 33 return &DialectorImpl{ 34 config: config, 35 connection: connection, 36 dsn: db.NewDsnImpl(config, connection), 37 } 38 } 39 40 func (d *DialectorImpl) Make(configs []databasecontract.Config) ([]gorm.Dialector, error) { 41 driver := d.config.GetString(fmt.Sprintf("database.connections.%s.driver", d.connection)) 42 43 var dialectors []gorm.Dialector 44 for _, item := range configs { 45 var dialector gorm.Dialector 46 var err error 47 switch orm.Driver(driver) { 48 case orm.DriverMysql: 49 dialector = d.mysql(item) 50 case orm.DriverPostgresql: 51 dialector = d.postgresql(item) 52 case orm.DriverSqlite: 53 dialector = d.sqlite(item) 54 case orm.DriverSqlserver: 55 dialector = d.sqlserver(item) 56 default: 57 err = fmt.Errorf("err database driver: %s, only support mysql, postgresql, sqlite and sqlserver", driver) 58 } 59 60 if err != nil { 61 return nil, err 62 } 63 64 dialectors = append(dialectors, dialector) 65 } 66 67 return dialectors, nil 68 } 69 70 func (d *DialectorImpl) mysql(config databasecontract.Config) gorm.Dialector { 71 dsn := d.dsn.Mysql(config) 72 if dsn == "" { 73 return nil 74 } 75 76 return mysql.New(mysql.Config{ 77 DSN: dsn, 78 }) 79 } 80 81 func (d *DialectorImpl) postgresql(config databasecontract.Config) gorm.Dialector { 82 dsn := d.dsn.Postgresql(config) 83 if dsn == "" { 84 return nil 85 } 86 87 return postgres.New(postgres.Config{ 88 DSN: dsn, 89 }) 90 } 91 92 func (d *DialectorImpl) sqlite(config databasecontract.Config) gorm.Dialector { 93 dsn := d.dsn.Sqlite(config) 94 if dsn == "" { 95 return nil 96 } 97 98 return sqlite.Open(dsn) 99 } 100 101 func (d *DialectorImpl) sqlserver(config databasecontract.Config) gorm.Dialector { 102 dsn := d.dsn.Sqlserver(config) 103 if dsn == "" { 104 return nil 105 } 106 107 return sqlserver.New(sqlserver.Config{ 108 DSN: dsn, 109 }) 110 }