github.com/unionj-cloud/go-doudou/v2@v2.3.5/toolkit/dbvendor/mysql/mysql.go (about) 1 package mysql 2 3 import ( 4 "context" 5 "database/sql" 6 "fmt" 7 "github.com/pkg/errors" 8 "github.com/unionj-cloud/go-doudou/v2/framework/database" 9 "github.com/unionj-cloud/go-doudou/v2/toolkit/dbvendor" 10 "gorm.io/gorm" 11 ) 12 13 func init() { 14 dbvendor.Registry.Register(database.DriverMysql, &Vendor{}) 15 } 16 17 var _ dbvendor.IVendor = (*Vendor)(nil) 18 19 type Vendor struct { 20 } 21 22 func (v *Vendor) GetBatchInsertStatement(dml dbvendor.DMLSchema, rows []interface{}) (statement string, err error) { 23 //TODO implement me 24 panic("implement me") 25 } 26 27 func (v *Vendor) ToColumnType(goType string, _ bool) string { 28 switch goType { 29 case "int", "int16", "int32": 30 return IntType 31 case "int64": 32 return BigintType 33 case "float32": 34 return FloatType 35 case "float64": 36 return DoubleType 37 case "string": 38 return VarcharType 39 case "text": 40 return LongtextType 41 case "bool", "int8": 42 return TinyintType 43 case "time.Time": 44 return DatetimeType 45 case "decimal.Decimal": 46 return "decimal(6,2)" 47 case "types.JSONText": 48 return JSONType 49 } 50 panic(fmt.Sprintf("no available type %s", goType)) 51 } 52 53 func (v *Vendor) CreateTable(ctx context.Context, db *gorm.DB, t dbvendor.Table) error { 54 var ( 55 statement string 56 err error 57 ) 58 if statement, err = dbvendor.String(createTable, createTable, t, nil); err != nil { 59 return err 60 } 61 return db.WithContext(ctx).Exec(statement).Error 62 } 63 64 func (v *Vendor) DropTable(ctx context.Context, db *gorm.DB, t dbvendor.Table) error { 65 var ( 66 statement string 67 err error 68 ) 69 if statement, err = dbvendor.String(dropTable, dropTable, t, nil); err != nil { 70 return err 71 } 72 return db.WithContext(ctx).Exec(statement).Error 73 } 74 75 func (v *Vendor) ChangeColumn(ctx context.Context, db *gorm.DB, col dbvendor.Column) error { 76 var ( 77 statement string 78 err error 79 ) 80 if statement, err = dbvendor.StringBlock(alterTable, alterTable, "change", col, nil); err != nil { 81 return err 82 } 83 return db.WithContext(ctx).Exec(statement).Error 84 } 85 86 func (v *Vendor) AddColumn(ctx context.Context, db *gorm.DB, col dbvendor.Column) error { 87 var ( 88 statement string 89 err error 90 ) 91 if statement, err = dbvendor.StringBlock(alterTable, alterTable, "add", col, nil); err != nil { 92 return err 93 } 94 return db.WithContext(ctx).Exec(statement).Error 95 } 96 97 func (v *Vendor) DropColumn(ctx context.Context, db *gorm.DB, col dbvendor.Column) error { 98 var ( 99 statement string 100 err error 101 ) 102 if statement, err = dbvendor.StringBlock(alterTable, alterTable, "drop", col, nil); err != nil { 103 return err 104 } 105 return db.WithContext(ctx).Exec(statement).Error 106 } 107 108 func (v *Vendor) Insert(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) (int64, error) { 109 var ( 110 statement string 111 err error 112 ) 113 if statement, err = v.GetInsertStatement(dml); err != nil { 114 return 0, errors.WithStack(err) 115 } 116 sqlDB, err := db.DB() 117 if err != nil { 118 return 0, errors.WithStack(err) 119 } 120 result, err := sqlDB.ExecContext(ctx, statement, args...) 121 if err != nil { 122 return 0, errors.WithStack(err) 123 } 124 id, err := result.LastInsertId() 125 if err != nil { 126 return 0, errors.WithStack(err) 127 } 128 return id, nil 129 } 130 131 func (v *Vendor) GetInsertStatement(dml dbvendor.DMLSchema) (statement string, err error) { 132 if statement, err = dbvendor.String(insertInto, insertInto, dml, dbvendor.Question); err != nil { 133 return "", errors.WithStack(err) 134 } 135 return statement, nil 136 } 137 138 func (v *Vendor) GetInsertReturningPkStatement(dml dbvendor.DMLSchema) (statement string, err error) { 139 if statement, err = dbvendor.String(insertInto, insertInto, dml, dbvendor.Question); err != nil { 140 return "", errors.WithStack(err) 141 } 142 return statement, nil 143 } 144 145 func (v *Vendor) GetUpdateStatement(dml dbvendor.DMLSchema) (statement string, err error) { 146 if statement, err = dbvendor.String(updateTable, updateTable, dml, dbvendor.Question); err != nil { 147 return "", errors.WithStack(err) 148 } 149 return statement, nil 150 } 151 152 func (v *Vendor) Update(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) error { 153 var ( 154 statement string 155 err error 156 ) 157 if statement, err = v.GetUpdateStatement(dml); err != nil { 158 return errors.WithStack(err) 159 } 160 sqlDB, err := db.DB() 161 if err != nil { 162 return errors.WithStack(err) 163 } 164 _, err = sqlDB.ExecContext(ctx, statement, args...) 165 if err != nil { 166 return errors.WithStack(err) 167 } 168 return nil 169 } 170 171 func (v *Vendor) Delete(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) error { 172 var ( 173 statement string 174 err error 175 ) 176 if statement, err = dbvendor.String(deleteFrom, deleteFrom, dml, dbvendor.Question); err != nil { 177 return errors.WithStack(err) 178 } 179 sqlDB, err := db.DB() 180 if err != nil { 181 return errors.WithStack(err) 182 } 183 _, err = sqlDB.ExecContext(ctx, statement, args...) 184 if err != nil { 185 return errors.WithStack(err) 186 } 187 return nil 188 } 189 190 func (v *Vendor) SelectById(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) (map[string]interface{}, error) { 191 var ( 192 statement string 193 err error 194 rows *sql.Rows 195 ) 196 if statement, err = dbvendor.String(selectFromById, selectFromById, dml, dbvendor.Question); err != nil { 197 return nil, errors.WithStack(err) 198 } 199 sqlDB, err := db.DB() 200 if err != nil { 201 return nil, errors.WithStack(err) 202 } 203 if rows, err = sqlDB.QueryContext(ctx, statement, args...); err != nil { 204 return nil, errors.WithStack(err) 205 } 206 result := make([]map[string]interface{}, 0) 207 dbvendor.Scan(rows, &result) 208 if len(result) == 0 { 209 return nil, errors.WithStack(sql.ErrNoRows) 210 } 211 return result[0], nil 212 }