-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmigrate.go
182 lines (178 loc) · 3.91 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
171
172
173
174
175
176
177
178
179
180
181
182
package f
import (
)
type Migrate struct {
db Database
}
type MigrateModel struct {
ID int `db:"id"`
Name string `db:"name"`
Batch int `db:"batch"`
Data string `db:"data"`
}
const createMigrateSQL = `
CREATE TABLE IF NOT EXISTS gofree_migrations (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
name varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
batch int(11) NOT NULL,
data text COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`
func (mi Migrate) Init(db Database) {
_, err := db.Core.Exec(createMigrateSQL)
if err != nil {
panic(err)
}
}
func NewMigrate (db Database) Migrate {
return Migrate{
db: db,
}
}
type CreateTableInfo struct {
TableName string
Fields []MigrateField
Engine string
DefaultCharset string
Collate string
}
type MigrateField struct {
name string
size int
fieldType string
unsigned bool
null bool
autoIncrement bool
callate string
defaultValue migrateDefaultValue
primaryKey string
extra []string
commit string
}
func (mi MigrateField) Int(size int) MigrateField {
mi.size = size
mi.fieldType = "int"
return mi
}
func (mi MigrateField) Varchar(size int) MigrateField {
mi.size = size
mi.fieldType = "varchar"
return mi
}
func (mi MigrateField) Unsigned() MigrateField {
mi.unsigned = true
return mi
}
func (mi Migrate) Utf8mb4_unicode_ci () string {
return "utf8mb4_unicode_ci"
}
func (mi Migrate) InnoDB () string {
return "InnoDB"
}
func (mi Migrate) Utf8mb4 () string {
return "utf8mb4"
}
func (mi MigrateField) Collate(kind string) MigrateField{
mi.callate = kind
return mi
}
type migrateDefaultValue struct {
raw string
}
func (mi Migrate) CurrentTimeStamp() migrateDefaultValue {
return migrateDefaultValue{
raw: "CURRENT_TIMESTAMP",
}
}
func (mi Migrate) DefaultString(s string) migrateDefaultValue {
return migrateDefaultValue{
raw: `"` + s + `"`,
}
}
func (mi MigrateField) Default(value migrateDefaultValue) MigrateField {
mi.defaultValue = value
return mi
}
func (mi MigrateField) Null() MigrateField{
mi.null = true
return mi
}
func (mi MigrateField) AutoIncrement() MigrateField {
mi.autoIncrement = true
return mi
}
func (mi MigrateField) PrimaryKey(field string) MigrateField {
mi.primaryKey = field
return mi
}
func (mi MigrateField) Text() MigrateField {
mi.fieldType = "text"
return mi
}
func (Migrate) MigrateName(name string){}
func (Migrate) CreateTable(info CreateTableInfo) {
sql := stringQueue{}
sql.Push("CREATE TABLE `", info.TableName , "`(")
}
type Alter struct {
migrateField MigrateField
tableName string
}
func (al Alter) Modify(migrateField MigrateField) Alter {
al.migrateField = migrateField
return al
}
func (Migrate) AlterTable(tableName string) Alter {
return Alter {
tableName: tableName,
}
}
func (Migrate) Field(name string) MigrateField {
return MigrateField{
name: name,
}
}
func (mi MigrateField) Timestamp() MigrateField {
mi.fieldType = "timestamp"
return mi
}
func (mi MigrateField) Commit(commit string) MigrateField {
mi.commit = commit
return mi
}
func (mi MigrateField) Extra(extra string) MigrateField {
mi.extra = append(mi.extra, extra)
return mi
}
func (mi MigrateField) OnUpdateCurrentTimeStamp() MigrateField {
mi.extra = append(mi.extra, "ON UPDATE CURRENT_TIMESTAMP")
return mi
}
func (mi Migrate) CreatedAtTimestamp() MigrateField {
return mi.Field("created_at").
Timestamp().
Default(mi.CurrentTimeStamp())
}
func (mi Migrate) UpdatedAtTimestamp() MigrateField {
return mi.Field("updated_at").
Timestamp().
Default(mi.CurrentTimeStamp()).
OnUpdateCurrentTimeStamp()
}
func (mi Migrate) DeletedAtTimestamp() MigrateField {
return mi.Field("deleted_at").
Timestamp().
Null()
}
func (mi Migrate) CUDTimestamp() []MigrateField {
return []MigrateField{
mi.CreatedAtTimestamp(),
mi.UpdatedAtTimestamp(),
mi.DeletedAtTimestamp(),
}
}
func (mi MigrateField) Tinyint(size int) MigrateField {
mi.fieldType = "tinyint"
return mi
}