github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sqlx/sql_enum_meta.go (about) 1 package sqlx 2 3 import ( 4 "github.com/artisanhe/tools/sqlx/builder" 5 ) 6 7 type EnumTypeDescriber interface { 8 EnumType() string 9 Enums() map[int][]string 10 } 11 12 type SqlMetaEnum struct { 13 TName string `db:"F_table_name" sql:"varchar(64) NOT NULL"` 14 CName string `db:"F_column_name" sql:"varchar(64) NOT NULL"` 15 Value int `db:"F_value" sql:"int NOT NULL"` 16 Type string `db:"F_type" sql:"varchar(255) NOT NULL"` 17 Key string `db:"F_key" sql:"varchar(255) NOT NULL"` 18 Label string `db:"F_label" sql:"varchar(255) NOT NULL"` 19 } 20 21 func (*SqlMetaEnum) TableName() string { 22 return "t_sql_meta_enum" 23 } 24 25 func (*SqlMetaEnum) UniqueIndexes() Indexes { 26 return Indexes{"I_enum": FieldNames{"TName", "CName", "Value"}} 27 } 28 29 func (database *Database) SyncEnum(db *DB) error { 30 task := NewTasks(db) 31 32 metaEnumTable := database.T(&SqlMetaEnum{}) 33 34 task = task.With(func(db *DB) error { 35 return db.Do(metaEnumTable.Create(true)).Err() 36 }) 37 38 task = task.With(func(db *DB) error { 39 return db.Do(metaEnumTable.Delete().Where(metaEnumTable.F("TName").In(database.TableNames()))).Err() 40 }) 41 42 stmt := metaEnumTable.Insert() 43 hasEnum := false 44 45 for _, table := range database.Tables { 46 table.Columns.Range(func(col *builder.Column, idx int) { 47 if col.IsEnum() { 48 for val := range col.Enums { 49 hasEnum = true 50 51 sqlMetaEnum := &SqlMetaEnum{ 52 TName: table.Name, 53 CName: col.Name, 54 Type: col.EnumType, 55 Value: val, 56 } 57 58 enum := col.Enums[val] 59 60 if len(enum) > 0 { 61 sqlMetaEnum.Key = enum[0] 62 } 63 64 if len(enum) > 1 { 65 sqlMetaEnum.Label = enum[1] 66 } 67 68 fieldValues := FieldValuesFromStructByNonZero(sqlMetaEnum, "Value") 69 cols, vals := metaEnumTable.ColumnsAndValuesByFieldValues(fieldValues) 70 stmt = stmt.Columns(cols).Values(vals...) 71 } 72 } 73 }) 74 } 75 76 if hasEnum { 77 task = task.With(func(db *DB) error { 78 return db.Do(stmt).Err() 79 }) 80 } 81 82 return task.Do() 83 }