github.com/RevenueMonster/sqlike@v1.0.6/examples/table.go (about) 1 package examples 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/RevenueMonster/sqlike/sqlike" 8 "github.com/stretchr/testify/require" 9 ) 10 11 // MigrateExamples : 12 func MigrateExamples(ctx context.Context, t *testing.T, db *sqlike.Database) { 13 var ( 14 ns *normalStruct 15 err error 16 results []sqlike.Column 17 columns []string 18 ) 19 20 table := db.Table("normal_struct") 21 22 { 23 err = db.Table("NormalStruct").DropIfExists(ctx) 24 require.NoError(t, err) 25 } 26 27 // migrate table 28 { 29 err = table.UnsafeMigrate(ctx, ns) 30 require.NoError(t, err) 31 columnMap := make(map[string]sqlike.Column) 32 columns = make([]string, 0) 33 results, err = table.Columns().List(ctx) 34 require.NoError(t, err) 35 36 table.MustMigrate(ctx, ns) 37 38 for _, f := range results { 39 columnMap[f.Name] = f 40 columns = append(columns, f.Name) 41 } 42 43 { 44 pk := columnMap["$Key"] 45 require.Equal(t, "VARCHAR(36)", pk.Type) 46 require.Equal(t, "$Key", pk.Name) 47 require.Equal(t, "Primary key", pk.Comment) 48 } 49 50 utf8mb4 := "utf8mb4" 51 // check struct tag option 52 require.Equal(t, "VARCHAR(300)", columnMap["CustomStrType"].Type) 53 require.Equal(t, "DOUBLE UNSIGNED", columnMap["UFloat32"].Type) 54 require.Equal(t, "ENUM('SUCCESS','FAILED','UNKNOWN')", columnMap["Enum"].Type) 55 // // enum by default is using latin1 for performance concern 56 require.Equal(t, &utf8mb4, columnMap["Enum"].Charset) 57 58 require.ElementsMatch(t, []string{ 59 "$Key", "Key", "PtrUUID", "Date", "SID", 60 "Emoji", "FullText", "LongStr", "CustomStrType", 61 "EmptyByte", "Byte", "Bool", 62 "Int", "TinyInt", "SmallInt", "MediumInt", "BigInt", 63 "Uint", "TinyUint", "SmallUint", "MediumUint", "BigUint", 64 "Float32", "Float64", "UFloat32", 65 "EmptyStruct", 66 "Struct", "VirtualColumn", "Struct.StoredStr", 67 "JSONRaw", "Map", 68 "DateTime", "Timestamp", "Location", 69 "Language", "Languages", "Currency", "Currencies", 70 "Enum", "Set", "CreatedAt", "UpdatedAt", 71 }, columns) 72 } 73 74 { 75 err = table.Rename(ctx, "NormalStruct") 76 require.NoError(t, err) 77 } 78 79 { 80 err = db.Table("NormalStruct").Truncate(ctx) 81 require.NoError(t, err) 82 } 83 84 // Alter table 85 { 86 err = db.Table("NormalStruct").Migrate(ctx, normalStruct{}) 87 require.NoError(t, err) 88 } 89 90 { 91 err = db.Table("PtrStruct").DropIfExists(ctx) 92 require.NoError(t, err) 93 } 94 95 { 96 err = db.Table("PtrStruct").Migrate(ctx, ptrStruct{}) 97 require.NoError(t, err) 98 } 99 100 // migrate table with generated columns 101 { 102 table := db.Table("GeneratedStruct") 103 err = table.DropIfExists(ctx) 104 require.NoError(t, err) 105 106 err = table.Migrate(ctx, generatedStruct{}) 107 require.NoError(t, err) 108 109 columns = make([]string, 0) 110 results, err = table.Columns().List(ctx) 111 require.NoError(t, err) 112 113 for _, f := range results { 114 columns = append(columns, f.Name) 115 } 116 117 require.ElementsMatch(t, []string{ 118 "NestedID", "Amount", "Nested", "CivilDate", 119 "No", "id", "Line1", "Line2", "City", "State", "Country", 120 "Date.CreatedAt", "Date.UpdatedAt", 121 }, columns) 122 123 err = table.Migrate(ctx, generatedStruct{}) 124 require.NoError(t, err) 125 } 126 127 temp := db.Table("Temp") 128 129 // migrate with auto_increment field 130 { 131 err = temp.DropIfExists(ctx) 132 require.NoError(t, err) 133 temp.MustMigrate(ctx, 134 struct { 135 ID string `sqlike:"$Key"` 136 Number int64 `sqlike:",auto_increment"` 137 }{}, 138 ) 139 } 140 141 // migrate with auto_increment field 142 { 143 err = temp.DropIfExists(ctx) 144 require.NoError(t, err) 145 temp.MustMigrate(ctx, struct { 146 ID string `sqlike:"$Key"` 147 Number int64 148 }{}) 149 150 temp.MustMigrate(ctx, struct { 151 ID string `sqlike:"$Key"` 152 Number int64 `sqlike:",auto_increment"` 153 }{}) 154 } 155 156 // migrate with overriding fields 157 { 158 table := db.Table("Override") 159 err = table.DropIfExists(ctx) 160 require.NoError(t, err) 161 table.MustUnsafeMigrate(ctx, overrideStruct{}) 162 163 cols, err := table.Columns().List(ctx) 164 require.NoError(t, err) 165 166 zero := "0" 167 require.Contains(t, cols, sqlike.Column{ 168 Name: "ID", 169 Position: 10, 170 Type: "BIGINT", 171 DataType: "BIGINT", 172 IsNullable: false, 173 DefaultValue: &zero, 174 Comment: "Int64 ID", 175 }) 176 require.Contains(t, cols, sqlike.Column{ 177 Name: "Amount", 178 Position: 11, 179 Type: "INT", 180 DataType: "INT", 181 IsNullable: false, 182 DefaultValue: &zero, 183 Comment: "Int Amount", 184 }) 185 186 emptyStr := "" 187 charset := "utf8mb4" 188 collate := "utf8mb4_unicode_ci" 189 require.Contains(t, cols, sqlike.Column{ 190 Name: "Nested", 191 Position: 12, 192 Type: "VARCHAR(191)", 193 DataType: "VARCHAR", 194 IsNullable: false, 195 DefaultValue: &emptyStr, 196 Charset: &charset, 197 Collation: &collate, 198 Comment: "String Nested", 199 }) 200 } 201 } 202 203 // MigrateErrorExamples : 204 func MigrateErrorExamples(ctx context.Context, t *testing.T, db *sqlike.Database) { 205 var ( 206 err error 207 ) 208 209 { 210 // empty table shouldn't able to migrate 211 err = db.Table("").Migrate(ctx, new(normalStruct)) 212 require.Error(t, err) 213 214 err = db.Table("NormalStruct").Migrate(ctx, int(1)) 215 require.Error(t, err) 216 217 err = db.Table("NormalStruct").Migrate(ctx, struct{}{}) 218 require.Error(t, err) 219 220 err = db.Table("NormalStruct").Migrate(ctx, nil) 221 require.Error(t, err) 222 223 err = db.Table("NormalStruct").Migrate(ctx, bool(false)) 224 require.Error(t, err) 225 226 err = db.Table("NormalStruct").Migrate(ctx, map[string]interface{}{}) 227 require.Error(t, err) 228 229 err = db.Table("NormalStruct").Migrate(ctx, []interface{}{}) 230 require.Error(t, err) 231 } 232 }