-
Notifications
You must be signed in to change notification settings - Fork 0
/
migrate.go
170 lines (144 loc) · 4.09 KB
/
migrate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package migrate
import (
"fmt"
"gorm.io/driver/mysql"
gormLogger "gorm.io/gorm/logger"
"log"
"os"
"time"
"github.com/go-kratos/kratos/v2/config"
"github.com/go-kratos/kratos/v2/config/file"
"gorm.io/gorm"
"github.com/devhg/kratos-example/internal/conf"
"github.com/devhg/kratos-example/internal/model"
"github.com/devhg/kratos-example/internal/utils"
"github.com/devhg/kratos-example/pkg/dotenv"
)
// go build -ldflags "-X main.Version=x.y.z"
var (
// Name is the name of the compiled software.
Name string
// Version is the version of the compiled software.
Version string
Db *gorm.DB
bconf *conf.Bootstrap
)
func loadBconf(flagConf string) {
c := config.New(
config.WithSource(
file.NewSource(flagConf),
),
)
if err := c.Load(); err != nil {
panic(err)
}
var bc conf.Bootstrap
if err := c.Scan(&bc); err != nil {
panic(err)
}
bconf = &bc
}
func Migrate(conf string, db *gorm.DB) error {
loadBconf(conf)
log.Println("正在连接数据库...")
if db == nil {
var err error
sqlConf := mysql.Config{
DriverName: bconf.Data.Database.Driver,
DSN: bconf.Data.Database.Source, // Data Source Name,参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name
}
db, err = gorm.Open(mysql.New(sqlConf), &gorm.Config{
SkipDefaultTransaction: true,
Logger: gormLogger.New(
log.New(os.Stdout, "\r", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
gormLogger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: gormLogger.Error, // 日志级别
IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误
Colorful: true, // 禁用彩色打印
},
),
})
if err != nil {
return err
}
}
// Migrate the schema
if err := db.AutoMigrate(
new(model.Article),
new(model.Admin), // 管理员表
new(model.Address), // 收货地址
); err != nil {
return err
}
log.Println("数据库同步完成.")
superAdminInfo := model.Admin{Username: "admin", IsSuper: true}
// 确保超级管理员账号存在
if err := db.Where(&superAdminInfo).First(&superAdminInfo).Error; err != nil {
if err == gorm.ErrRecordNotFound {
err = db.Create(&model.Admin{
Username: "admin",
Name: "admin",
Password: utils.GeneratePassword(dotenv.GetByDefault("ADMIN_DEFAULT_PASSWORD", "123456")),
Status: model.AdminStatusInit,
IsSuper: true,
}).Error
if err != nil {
return err
}
} else {
return err
}
}
return nil
}
func Connect() {
log.Println("正在连接数据库...")
var err error
sqlConf := mysql.Config{
DriverName: bconf.Data.Database.Driver,
DSN: bconf.Data.Database.Source, // Data Source Name,参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name
}
Db, err = gorm.Open(mysql.New(sqlConf), &gorm.Config{
SkipDefaultTransaction: true,
Logger: gormLogger.New(
log.New(os.Stdout, "\r", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
gormLogger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: gormLogger.Info, // 日志级别
IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误
Colorful: true, // 禁用彩色打印
},
),
})
if err != nil {
panic(err)
}
log.Println("连接数据库成功...")
}
// DeleteRowByTable WANING: 该操作会删除数据,并且不可恢复
// 通常只用于测试中
func DeleteRowByTable(tableName string, field string, value interface{}) {
var (
err error
tx *gorm.DB
)
defer func() {
CommitOrRollback(tx, err)
}()
tx = Db.Begin()
raw := fmt.Sprintf("DELETE FROM \"%s\" WHERE %s = '%s'", tableName, field, value)
if err = tx.Exec(raw).Error; err != nil {
return
}
}
func CommitOrRollback(tx *gorm.DB, err error) {
fmt.Println(tx == nil, err == nil)
if tx != nil {
if err != nil {
_ = tx.Rollback()
} else {
_ = tx.Commit()
}
}
}