github.com/goravel/framework@v1.13.9/database/console/migrate.go (about)

     1  package console
     2  
     3  import (
     4  	"database/sql"
     5  	"errors"
     6  	"fmt"
     7  
     8  	"github.com/golang-migrate/migrate/v4"
     9  	"github.com/golang-migrate/migrate/v4/database/mysql"
    10  	"github.com/golang-migrate/migrate/v4/database/postgres"
    11  	"github.com/golang-migrate/migrate/v4/database/sqlserver"
    12  
    13  	"github.com/goravel/framework/contracts/config"
    14  	"github.com/goravel/framework/contracts/database/orm"
    15  	"github.com/goravel/framework/database/console/driver"
    16  	"github.com/goravel/framework/database/db"
    17  	"github.com/goravel/framework/support"
    18  )
    19  
    20  func getMigrate(config config.Config) (*migrate.Migrate, error) {
    21  	connection := config.GetString("database.default")
    22  	driver := config.GetString("database.connections." + connection + ".driver")
    23  	dir := "file://./database/migrations"
    24  	if support.RelativePath != "" {
    25  		dir = fmt.Sprintf("file://%s/database/migrations", support.RelativePath)
    26  	}
    27  
    28  	gormConfig := db.NewConfigImpl(config, connection)
    29  	writeConfigs := gormConfig.Writes()
    30  	if len(writeConfigs) == 0 {
    31  		return nil, errors.New("not found database configuration")
    32  	}
    33  
    34  	switch orm.Driver(driver) {
    35  	case orm.DriverMysql:
    36  		dsn := db.NewDsnImpl(config, connection)
    37  		mysqlDsn := dsn.Mysql(writeConfigs[0])
    38  		if mysqlDsn == "" {
    39  			return nil, nil
    40  		}
    41  
    42  		db, err := sql.Open("mysql", mysqlDsn)
    43  		if err != nil {
    44  			return nil, err
    45  		}
    46  
    47  		instance, err := mysql.WithInstance(db, &mysql.Config{
    48  			MigrationsTable: config.GetString("database.migrations"),
    49  		})
    50  		if err != nil {
    51  			return nil, err
    52  		}
    53  
    54  		return migrate.NewWithDatabaseInstance(dir, "mysql", instance)
    55  	case orm.DriverPostgresql:
    56  		dsn := db.NewDsnImpl(config, connection)
    57  		postgresqlDsn := dsn.Postgresql(writeConfigs[0])
    58  		if postgresqlDsn == "" {
    59  			return nil, nil
    60  		}
    61  
    62  		db, err := sql.Open("postgres", postgresqlDsn)
    63  		if err != nil {
    64  			return nil, err
    65  		}
    66  
    67  		instance, err := postgres.WithInstance(db, &postgres.Config{
    68  			MigrationsTable: config.GetString("database.migrations"),
    69  		})
    70  		if err != nil {
    71  			return nil, err
    72  		}
    73  
    74  		return migrate.NewWithDatabaseInstance(dir, "postgres", instance)
    75  	case orm.DriverSqlite:
    76  		dsn := db.NewDsnImpl(config, "")
    77  		sqliteDsn := dsn.Sqlite(writeConfigs[0])
    78  		if sqliteDsn == "" {
    79  			return nil, nil
    80  		}
    81  
    82  		db, err := sql.Open("sqlite", sqliteDsn)
    83  		if err != nil {
    84  			return nil, err
    85  		}
    86  
    87  		instance, err := sqlite.WithInstance(db, &sqlite.Config{
    88  			MigrationsTable: config.GetString("database.migrations"),
    89  		})
    90  		if err != nil {
    91  			return nil, err
    92  		}
    93  
    94  		return migrate.NewWithDatabaseInstance(dir, "sqlite3", instance)
    95  	case orm.DriverSqlserver:
    96  		dsn := db.NewDsnImpl(config, connection)
    97  		sqlserverDsn := dsn.Sqlserver(writeConfigs[0])
    98  		if sqlserverDsn == "" {
    99  			return nil, nil
   100  		}
   101  
   102  		db, err := sql.Open("sqlserver", sqlserverDsn)
   103  		if err != nil {
   104  			return nil, err
   105  		}
   106  
   107  		instance, err := sqlserver.WithInstance(db, &sqlserver.Config{
   108  			MigrationsTable: config.GetString("database.migrations"),
   109  		})
   110  
   111  		if err != nil {
   112  			return nil, err
   113  		}
   114  
   115  		return migrate.NewWithDatabaseInstance(dir, "sqlserver", instance)
   116  	default:
   117  		return nil, errors.New("database driver only support mysql, postgresql, sqlite and sqlserver")
   118  	}
   119  }