Feat: Decide whether to do database migration based on `version.lock`

pull/247/head
HFO4 5 years ago
parent c5493fd1f1
commit e858cbe2cf

5
.gitignore vendored

@ -12,4 +12,7 @@
*.out
# Development enviroment
.idea/
.idea/
# Version control
version.lock

@ -1,3 +1,6 @@
[System]
Debug = true
[Database]
Type = mysql
User = root

@ -1,4 +1,4 @@
module Cloudreve
module cloudreve
go 1.12
@ -10,6 +10,7 @@ require (
github.com/go-playground/universal-translator v0.16.0 // indirect
github.com/jinzhu/gorm v1.9.11
github.com/leodido/go-urn v1.2.0 // indirect
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2
github.com/pkg/errors v0.8.0
github.com/stretchr/testify v1.4.0
gopkg.in/go-playground/validator.v8 v8.18.2

@ -1,18 +1,23 @@
package main
import (
"Cloudreve/models"
"Cloudreve/pkg/conf"
"Cloudreve/routers"
"cloudreve/models"
"cloudreve/pkg/conf"
"cloudreve/routers"
"github.com/gin-gonic/gin"
)
func init() {
conf.Init("conf/conf.ini")
model.Init()
// Debug 关闭时,切换为生产模式
if !conf.SystemConfig.Debug {
gin.SetMode(gin.ReleaseMode)
}
}
func main() {
api := routers.InitRouter()
api.Run(":5000")

@ -1,8 +1,8 @@
package model
import (
"Cloudreve/pkg/conf"
"Cloudreve/pkg/util"
"cloudreve/pkg/conf"
"cloudreve/pkg/util"
"fmt"
"github.com/jinzhu/gorm"
"time"
@ -15,7 +15,6 @@ var DB *gorm.DB
// Database 在中间件中初始化mysql链接
func Init() {
//TODO 从配置文件中读取 包括DEBUG模式
util.Log().Info("初始化数据库连接\n")
var (
@ -37,7 +36,11 @@ func Init() {
return conf.DatabaseConfig.TablePrefix + defaultTableName
}
db.LogMode(true)
// Debug 模式下,输出所有 SQL 日志
if conf.SystemConfig.Debug {
db.LogMode(true)
}
//db.SetLogger(util.Log())
if err != nil {
util.Log().Panic("连接数据库不成功", err)

@ -1,14 +1,31 @@
package model
import (
"Cloudreve/pkg/util"
"cloudreve/pkg/conf"
"cloudreve/pkg/util"
"github.com/jinzhu/gorm"
"github.com/mcuadros/go-version"
"io/ioutil"
)
//执行数据迁移
func migration() {
// 检查 version.lock 确认是否需要执行迁移
// Debug 模式下一定会执行迁移
if !conf.SystemConfig.Debug {
if util.Exists("version.lock") {
versionLock, _ := ioutil.ReadFile("version.lock")
if version.Compare(string(versionLock), conf.BackendVersion, "=") {
util.Log().Info("后端版本匹配,跳过数据库迁移")
return
}
}
}
util.Log().Info("开始进行数据库自动迁移...")
// 自动迁移模式
DB.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})
DB.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{}, &Setting{})
// 添加初始用户
_, err := GetUser(1)
@ -29,4 +46,10 @@ func migration() {
}
}
// 迁移完毕后写入版本锁 version.lock
err = conf.WriteVersionLock()
if err != nil {
util.Log().Warning("无法写入版本控制锁 version.lock, ", err)
}
}

@ -0,0 +1,26 @@
package model
import (
"github.com/jinzhu/gorm"
)
// Setting 系统设置模型
type Setting struct {
gorm.Model
Type string `gorm:"not null"`
Name string `gorm:"unique;not null;index:setting_key"`
Value string `gorm:"size:65535"`
}
// GetSettingByName 用 Name 获取设置值
func GetSettingByName(name string) (Setting, error) {
var setting Setting
// 优先尝试数据库中查找
result := DB.Where("name = ?", name).First(&setting)
if result.Error == nil {
return setting, nil
}
return setting, result.Error
}

@ -1,8 +1,8 @@
package model
import (
"Cloudreve/pkg/serializer"
"Cloudreve/pkg/util"
"cloudreve/pkg/serializer"
"cloudreve/pkg/util"
"crypto/sha1"
"encoding/hex"
"encoding/json"

@ -1,11 +1,11 @@
package conf
import (
"Cloudreve/pkg/util"
"cloudreve/pkg/util"
"github.com/go-ini/ini"
)
// Database 数据库
// database 数据库
type database struct {
Type string
User string
@ -19,6 +19,13 @@ var DatabaseConfig = &database{
Type: "UNSET",
}
// system 系统通用配置
type system struct {
Debug bool
}
var SystemConfig = &system{}
var cfg *ini.File
// Init 初始化配置文件
@ -30,9 +37,16 @@ func Init(path string) {
if err != nil {
util.Log().Panic("无法解析配置文件 '%s': ", path, err)
}
err = mapSection("Database", DatabaseConfig)
if err != nil {
util.Log().Warning("配置文件 %s 分区解析失败: ", "Database", err)
sections := map[string]interface{}{
"Database": DatabaseConfig,
"System": SystemConfig,
}
for sectionName, sectionStruct := range sections {
err = mapSection(sectionName, sectionStruct)
if err != nil {
util.Log().Warning("配置文件 %s 分区解析失败: ", sectionName, err)
}
}
}

@ -78,5 +78,4 @@ TablePrefix = v3_`
err = mapSection("Database", DatabaseConfig)
asserts.NoError(err)
// TODO 类型不匹配测试
}

@ -0,0 +1,11 @@
package conf
import "io/ioutil"
const BackendVersion = string("3.0.0-b")
// WriteVersionLock 将当前版本信息写入 version.lock
func WriteVersionLock() error {
err := ioutil.WriteFile("version.lock", []byte(BackendVersion), 0644)
return err
}

@ -0,0 +1,13 @@
package util
import "os"
// Exists reports whether the named file or directory exists.
func Exists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}

@ -1,7 +1,7 @@
package controllers
import (
"Cloudreve/pkg/serializer"
"cloudreve/pkg/serializer"
"encoding/json"
"gopkg.in/go-playground/validator.v8"
)

@ -1,7 +1,7 @@
package controllers
import (
"Cloudreve/pkg/serializer"
"cloudreve/pkg/serializer"
"encoding/json"
"errors"
"github.com/stretchr/testify/assert"

@ -1,7 +1,7 @@
package controllers
import (
"Cloudreve/pkg/serializer"
"cloudreve/pkg/serializer"
"github.com/gin-gonic/gin"
)

@ -1,7 +1,7 @@
package controllers
import (
"Cloudreve/service/user"
"cloudreve/service/user"
"github.com/gin-gonic/gin"
)

@ -1,7 +1,7 @@
package routers
import (
"Cloudreve/routers/controllers"
"cloudreve/routers/controllers"
"github.com/gin-gonic/gin"
)

@ -1,7 +1,7 @@
package service
import (
"Cloudreve/pkg/serializer"
"cloudreve/pkg/serializer"
"github.com/gin-gonic/gin"
)

Loading…
Cancel
Save