github.com/RevenueMonster/sqlike@v1.0.6/examples/update.go (about) 1 package examples 2 3 import ( 4 "context" 5 "database/sql" 6 "testing" 7 "time" 8 9 "cloud.google.com/go/civil" 10 "github.com/RevenueMonster/sqlike/sql/expr" 11 "github.com/RevenueMonster/sqlike/sqlike" 12 "github.com/RevenueMonster/sqlike/sqlike/actions" 13 "github.com/RevenueMonster/sqlike/sqlike/options" 14 uuid "github.com/google/uuid" 15 "github.com/stretchr/testify/require" 16 ) 17 18 // UpdateExamples : 19 func UpdateExamples(ctx context.Context, t *testing.T, db *sqlike.Database) { 20 var ( 21 ns normalStruct 22 err error 23 result sql.Result 24 affected int64 25 ) 26 27 table := db.Table("NormalStruct") 28 uid, _ := uuid.Parse(`be72fc34-917b-11e9-af91-6c96cfd87b17`) 29 uid2, _ := uuid.Parse("ae608554-491c-4472-beac-97feef49e810") 30 31 { 32 ns = normalStruct{} 33 ns.ID = uid 34 ns.Timestamp = time.Now() 35 result, err = table.InsertOne( 36 ctx, 37 &ns, 38 options.InsertOne(). 39 SetMode(options.InsertIgnore)) 40 affected, _ = result.RowsAffected() 41 require.NoError(t, err) 42 require.Equal(t, int64(1), affected) 43 44 ns = normalStruct{} 45 ns.ID = uid2 46 ns.Timestamp = time.Now() 47 result, err = table.InsertOne( 48 ctx, 49 &ns, 50 options.InsertOne(). 51 SetMode(options.InsertIgnore)) 52 affected, _ = result.RowsAffected() 53 require.NoError(t, err) 54 require.Equal(t, int64(1), affected) 55 } 56 57 cnp := "✂️ Copy and 📋 Paste" 58 now := time.Now().UTC() 59 bigInt := int64(23127381237222) 60 61 { 62 // ModifyOne 63 ns.Emoji = cnp 64 ns.Enum = Success 65 ns.BigInt = bigInt 66 ns.Date = civil.DateOf(now) 67 ns.DateTime = now 68 ns.CreatedAt = now 69 ns.UpdatedAt = now 70 err = table.ModifyOne( 71 ctx, 72 &ns, 73 options.ModifyOne().SetDebug(true)) 74 require.NoError(t, err) 75 76 err = table.ModifyOne( 77 ctx, 78 &ns, 79 options.ModifyOne().SetDebug(true)) 80 require.Error(t, err) 81 82 err = table.ModifyOne( 83 ctx, 84 &ns, 85 options.ModifyOne(). 86 SetStrict(false). 87 SetDebug(true)) 88 require.NoError(t, err) 89 90 ns2 := normalStruct{} 91 err = table.FindOne( 92 ctx, 93 actions.FindOne(). 94 Where( 95 expr.Equal("$Key", ns.ID), 96 ), 97 ).Decode(&ns2) 98 require.NoError(t, err) 99 require.Equal(t, cnp, ns2.Emoji) 100 require.Equal(t, Success, ns2.Enum) 101 require.Equal(t, bigInt, ns2.BigInt) 102 require.NotZero(t, ns2.DateTime) 103 require.NotZero(t, ns2.CreatedAt) 104 require.NotZero(t, ns2.UpdatedAt) 105 require.Nil(t, ns2.Location) 106 } 107 108 { 109 // ModifyOne with custom primary key 110 type newStruct struct { 111 Key int64 `sqlike:"$Key"` 112 No int64 113 Message string 114 Flag bool 115 ID int64 `sqlike:",primary_key"` 116 } 117 118 tbl := db.Table("NewStruct") 119 120 tbl.MustMigrate(ctx, newStruct{}) 121 err = tbl.Truncate(ctx) 122 require.NoError(t, err) 123 124 ns := newStruct{} 125 ns.Key = 8888 126 ns.No = 1500 127 ns.ID = 1 128 result, err = tbl.InsertOne( 129 ctx, 130 &ns, 131 options.InsertOne(). 132 SetMode(options.InsertIgnore)) 133 affected, _ = result.RowsAffected() 134 require.NoError(t, err) 135 require.Equal(t, int64(1), affected) 136 137 ns.Key = 6767 138 ns.Message = "hello world" 139 ns.Flag = true 140 ns.No = 1800 141 err = tbl.ModifyOne( 142 ctx, 143 &ns, 144 options.ModifyOne().SetDebug(true), 145 ) 146 require.NoError(t, err) 147 148 ns2 := newStruct{} 149 err = tbl.FindOne( 150 ctx, 151 actions.FindOne(). 152 Where( 153 expr.Equal("ID", 1), 154 ), 155 ).Decode(&ns2) 156 require.NoError(t, err) 157 require.Equal(t, int64(6767), ns2.Key) 158 require.Equal(t, int64(1800), ns2.No) 159 require.Equal(t, "hello world", ns2.Message) 160 require.Equal(t, true, ns2.Flag) 161 } 162 163 // Update single record 164 { 165 affected, err = table.UpdateOne( 166 ctx, 167 actions.UpdateOne(). 168 Where(expr.Equal("$Key", uid)). 169 Set( 170 expr.ColumnValue("LongStr", "1234abcd"), 171 expr.ColumnValue("Emoji", "<😗>"), 172 ), 173 options.UpdateOne().SetDebug(true), 174 ) 175 176 require.NoError(t, err) 177 require.Equal(t, int64(1), affected) 178 } 179 180 // Advance update query 181 { 182 /* 183 UPDATE `sqlike`.`NormalStruct` 184 SET 185 `Emoji` = "<😗>", 186 `SID` = `LongStr`, 187 `Int` = `Int` + 100, 188 `Tinyint` = 80 189 WHERE `$Key` = "be72fc34-917b-11e9-af91-6c96cfd87b17" 190 LIMIT 1; 191 */ 192 affected, err = table.UpdateOne( 193 ctx, 194 actions.UpdateOne(). 195 Where( 196 expr.Equal("$Key", uid), 197 ). 198 Set( 199 expr.ColumnValue("Emoji", "<😗>"), 200 expr.ColumnValue("SID", expr.Column("LongStr")), 201 expr.ColumnValue("Int", expr.Increment("Int", 100)), 202 expr.ColumnValue("Tinyint", expr.Raw("80")), 203 ), 204 options.UpdateOne().SetDebug(true), 205 ) 206 207 require.NoError(t, err) 208 require.Equal(t, int64(1), affected) 209 } 210 211 // update with case 212 { 213 /* 214 UPDATE `sqlike`.`NormalStruct` SET `SID` = ( 215 CASE 216 WHEN (`$Key` = "be72fc34-917b-11e9-af91-6c96cfd87b17" AND `$Key` IS NOT NULL) THEN 88 217 WHEN `$Key` = "ae608554-491c-4472-beac-97feef49e810" THEN 56789 218 ELSE 100 219 END 220 ) 221 WHERE `$Key` IN ( 222 "be72fc34-917b-11e9-af91-6c96cfd87b17", 223 "ae608554-491c-4472-beac-97feef49e810" 224 ); 225 */ 226 227 uids := []uuid.UUID{uid, uid2} 228 i8 := int8(88) 229 i32 := int32(100) 230 i64 := int64(56789) 231 affected, err = table.Update( 232 ctx, 233 actions.Update(). 234 Where(expr.In("$Key", uids)). 235 Set( 236 expr.ColumnValue( 237 "SID", 238 expr.Case(). 239 When( 240 expr.And( 241 expr.Equal("$Key", uid), 242 expr.NotNull("$Key"), 243 ), 244 i8, 245 ). 246 When( 247 expr.Equal("$Key", uid2), 248 i64, 249 ). 250 Else(i32), 251 ), 252 ), 253 options.Update().SetDebug(true), 254 ) 255 256 require.NoError(t, err) 257 require.Equal(t, int64(2), affected) 258 259 var result1 normalStruct 260 err := table.FindOne( 261 ctx, 262 actions.FindOne(). 263 Where( 264 expr.Equal("$Key", uid), 265 ), 266 ).Decode(&result1) 267 require.NoError(t, err) 268 269 require.Equal(t, "88", result1.SID) 270 271 var result2 normalStruct 272 err = table.FindOne( 273 ctx, 274 actions.FindOne(). 275 Where( 276 expr.Equal("$Key", uid2), 277 ), 278 ).Decode(&result2) 279 require.NoError(t, err) 280 281 require.Equal(t, "56789", result2.SID) 282 } 283 284 } 285 286 // UpdateErrorExamples : 287 func UpdateErrorExamples(ctx context.Context, t *testing.T, db *sqlike.Database) { 288 var ( 289 ns normalStruct 290 err error 291 ) 292 293 table := db.Table("NormalStruct") 294 295 { 296 err = table.ModifyOne(ctx, nil) 297 require.Error(t, err) 298 299 err = table.ModifyOne(ctx, &struct{}{}) 300 require.Error(t, err) 301 302 err = table.ModifyOne(ctx, &ns) 303 require.Equal(t, sqlike.ErrNoRecordAffected, err) 304 } 305 }