Start on migrating database integration to gorm

This commit is contained in:
viktorstrate
2020-11-23 19:39:44 +01:00
parent 8781ab3777
commit 27b2f95a7b
19 changed files with 214 additions and 197 deletions

View File

@@ -1,27 +1,19 @@
package database
import (
"context"
"database/sql"
"log"
"net/url"
"os"
"time"
"github.com/pkg/errors"
"github.com/viktorstrate/photoview/api/graphql/models"
// Load mysql driver
_ "github.com/go-sql-driver/mysql"
"github.com/golang-migrate/migrate"
"github.com/golang-migrate/migrate/database/mysql"
// Migrate from file
_ "github.com/golang-migrate/migrate/source/file"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// SetupDatabase connects to the database using environment variables
func SetupDatabase() (*sql.DB, error) {
func SetupDatabase() (*gorm.DB, error) {
address, err := url.Parse(os.Getenv("MYSQL_URL"))
if err != nil {
@@ -40,62 +32,46 @@ func SetupDatabase() (*sql.DB, error) {
log.Printf("Connecting to database: %s", address)
var db *sql.DB
db, err = sql.Open("mysql", address.String())
db, err := gorm.Open(mysql.Open(address.String()), &gorm.Config{})
if err != nil {
return nil, errors.New("Could not connect to database, exiting")
return nil, errors.Wrap(err, "could not connect to database")
}
tryCount := 0
// var db *sql.DB
for {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// db, err = sql.Open("mysql", address.String())
// if err != nil {
// return nil, errors.New("Could not connect to database, exiting")
// }
if err := db.PingContext(ctx); err != nil {
if tryCount < 4 {
tryCount++
log.Printf("WARN: Could not ping database: %s, Will retry after 1 second", err)
time.Sleep(time.Second)
continue
} else {
return nil, errors.Wrap(err, "Could not ping database, exiting")
}
}
// tryCount := 0
break
}
// for {
// ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
// defer cancel()
db.SetMaxOpenConns(80)
// if err := db.PingContext(ctx); err != nil {
// if tryCount < 4 {
// tryCount++
// log.Printf("WARN: Could not ping database: %s, Will retry after 1 second", err)
// time.Sleep(time.Second)
// continue
// } else {
// return nil, errors.Wrap(err, "Could not ping database, exiting")
// }
// }
// break
// }
// db.SetMaxOpenConns(80)
return db, nil
}
func MigrateDatabase(db *sql.DB) error {
driver, err := mysql.WithInstance(db, &mysql.Config{})
if err != nil {
return err
}
func MigrateDatabase(db *gorm.DB) error {
m, err := migrate.NewWithDatabaseInstance(
"file://database/migrations",
"mysql",
driver,
)
if err != nil {
return err
}
if err := m.Up(); err != nil {
if err.Error() == "no change" {
log.Println("Database is up to date")
} else {
return err
}
} else {
log.Println("Database migrated")
}
db.AutoMigrate(&models.User{}, &models.AccessToken{})
return nil
}