Files
Super-HomeworkManager/internal/database/database.go
2026-01-05 11:27:37 +09:00

96 lines
1.8 KiB
Go

package database
import (
"fmt"
"time"
"homework-manager/internal/config"
"homework-manager/internal/models"
"github.com/glebarez/sqlite"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
func Connect(dbConfig config.DatabaseConfig, debug bool) error {
var logMode logger.LogLevel
if debug {
logMode = logger.Info
} else {
logMode = logger.Silent
}
gormConfig := &gorm.Config{
Logger: logger.Default.LogMode(logMode),
}
var db *gorm.DB
var err error
switch dbConfig.Driver {
case "mysql":
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
dbConfig.User,
dbConfig.Password,
dbConfig.Host,
dbConfig.Port,
dbConfig.Name,
)
db, err = gorm.Open(mysql.Open(dsn), gormConfig)
case "postgres":
dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
dbConfig.Host,
dbConfig.Port,
dbConfig.User,
dbConfig.Password,
dbConfig.Name,
)
db, err = gorm.Open(postgres.Open(dsn), gormConfig)
case "sqlite":
fallthrough
default:
db, err = gorm.Open(sqlite.Open(dbConfig.Path), gormConfig)
}
if err != nil {
return err
}
// Set connection pool settings
sqlDB, err := db.DB()
if err != nil {
return err
}
// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
sqlDB.SetConnMaxLifetime(time.Hour)
DB = db
return nil
}
func Migrate() error {
return DB.AutoMigrate(
&models.User{},
&models.Assignment{},
&models.APIKey{},
&models.UserNotificationSettings{},
)
}
func GetDB() *gorm.DB {
return DB
}