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