github.com/RevenueMonster/sqlike@v1.0.6/examples/insert.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 "github.com/stretchr/testify/require" 15 ) 16 17 // InsertExamples : 18 func InsertExamples(ctx context.Context, t *testing.T, db *sqlike.Database) { 19 var ( 20 err error 21 result sql.Result 22 affected int64 23 ) 24 25 table := db.Table("NormalStruct") 26 ns := newNormalStruct() 27 28 // Single insert 29 { 30 result, err = table.InsertOne( 31 ctx, 32 &ns, 33 options.InsertOne(). 34 SetOmitFields("Int"). 35 SetDebug(true)) 36 require.NoError(t, err) 37 affected, err = result.RowsAffected() 38 require.NoError(t, err) 39 require.Equal(t, int64(1), affected) 40 } 41 42 // Single upsert 43 // - https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html 44 { 45 ns.Emoji = `🤕` 46 m := make(map[string]int) 47 m["one"] = 1 48 m["two"] = 2 49 ns.Map = m 50 result, err = table.InsertOne( 51 ctx, 52 &ns, 53 options.InsertOne(). 54 SetDebug(true). 55 SetMode(options.InsertOnDuplicate)) 56 require.NoError(t, err) 57 affected, err = result.RowsAffected() 58 require.NoError(t, err) 59 // upsert affected is 2 instead of 1 60 require.Equal(t, int64(2), affected) 61 62 } 63 64 // upsert with omitfield 65 { 66 ns2 := newNormalStruct() 67 result, err = table.InsertOne( 68 ctx, 69 &ns2, 70 options.InsertOne(). 71 SetDebug(true). 72 SetMode(options.InsertOnDuplicate)) 73 require.NoError(t, err) 74 affected, err = result.RowsAffected() 75 require.NoError(t, err) 76 require.Equal(t, int64(1), affected) 77 78 temp := ns2 79 temp.Date = civil.Date{Year: 2020, Month: 12, Day: 7} 80 temp.BigUint = 188 81 temp.BigInt = 188 82 temp.Byte = []byte("testing 123") 83 temp.Emoji = "🥶 😱 😨 😰" 84 result, err = table.InsertOne( 85 ctx, 86 &temp, 87 options.InsertOne(). 88 SetOmitFields("Date", "BigUint", "EmptyByte", "Byte"). 89 SetDebug(true). 90 SetMode(options.InsertOnDuplicate)) 91 require.NoError(t, err) 92 affected, err = result.RowsAffected() 93 require.NoError(t, err) 94 // upsert affected is 2 instead of 1 95 require.Equal(t, int64(2), affected) 96 97 var o normalStruct 98 err = table.FindOne( 99 ctx, 100 actions.FindOne(). 101 Where( 102 expr.Equal("$Key", ns2.ID), 103 ), 104 options.FindOne().SetDebug(true), 105 ).Decode(&o) 106 require.NoError(t, err) 107 108 // ensure the value didn't get modified on duplicate 109 require.Equal(t, o.BigUint, ns2.BigUint) 110 require.Equal(t, o.Byte, ns2.Byte) 111 require.NotEqual(t, o.BigInt, ns2.BigInt) 112 require.NotEqual(t, o.Emoji, ns2.Emoji) 113 require.Equal(t, o.Date.String(), ns2.Date.String()) 114 } 115 116 // upsert with unordered primary key 117 { 118 type unorderedStruct struct { 119 Text string 120 Number int8 121 ID string `sqlike:",primary_key"` 122 Date civil.Date 123 } 124 125 table := db.Table("unorderedStruct") 126 table.DropIfExists(ctx) 127 table.MustUnsafeMigrate(ctx, unorderedStruct{}) 128 _, err = table.InsertOne( 129 ctx, 130 &unorderedStruct{ 131 ID: "224", 132 Date: civil.DateOf(time.Now()), 133 }, 134 options.InsertOne().SetMode(options.InsertOnDuplicate), 135 ) 136 require.NoError(t, err) 137 } 138 139 // Multiple insert 140 { 141 nss := [...]normalStruct{ 142 newNormalStruct(), 143 newNormalStruct(), 144 newNormalStruct(), 145 } 146 result, err = table.Insert( 147 ctx, 148 &nss, 149 options.Insert().SetDebug(true), 150 ) 151 require.NoError(t, err) 152 affected, err = result.RowsAffected() 153 require.NoError(t, err) 154 require.Equal(t, int64(3), affected) 155 } 156 157 table2 := db.Table("PtrStruct") 158 159 // Pointer insertion 160 { 161 _, err = table2.InsertOne( 162 ctx, 163 &ptrStruct{}, 164 options.InsertOne().SetDebug(true), 165 ) 166 require.NoError(t, err) 167 } 168 169 // Pointer insertion 170 { 171 ps := []ptrStruct{ 172 newPtrStruct(), 173 newPtrStruct(), 174 newPtrStruct(), 175 newPtrStruct(), 176 newPtrStruct(), 177 } 178 _, err = table2.Insert( 179 ctx, 180 &ps, 181 options.Insert().SetDebug(true), 182 ) 183 require.NoError(t, err) 184 } 185 186 // Error insertion 187 { 188 _, err = table.InsertOne( 189 ctx, 190 &struct { 191 Interface interface{} 192 }{}, 193 ) 194 require.Error(t, err) 195 _, err = table.InsertOne(ctx, struct{}{}) 196 require.Error(t, err) 197 var empty *struct{} 198 _, err = table.InsertOne(ctx, empty) 199 require.Error(t, err) 200 201 _, err = table.Insert(ctx, []interface{}{}) 202 require.Error(t, err) 203 } 204 205 table3 := db.Table("GeneratedStruct") 206 207 // generated column insertion 208 { 209 cols := []*generatedStruct{ 210 newGeneratedStruct(), 211 newGeneratedStruct(), 212 newGeneratedStruct(), 213 newGeneratedStruct(), 214 newGeneratedStruct(), 215 } 216 _, err = table3.Insert( 217 ctx, 218 &cols, 219 options.Insert().SetDebug(true), 220 ) 221 require.NoError(t, err) 222 } 223 224 { 225 table := db.Table("Override") 226 err := table.Truncate(ctx) 227 require.NoError(t, err) 228 table.MustUnsafeMigrate(ctx, overrideStruct{}) 229 230 now, err := time.Parse("2006-01-02 15:04:05", "2018-01-01 00:00:00") 231 require.NoError(t, err) 232 233 os := overrideStruct{} 234 os.Amount = 9000 235 os.Amount = 100 236 os.ID = 1007 237 os.generatedStruct.ID = "" 238 os.CivilDate = civil.DateOf(now) 239 os.CreatedAt = now 240 os.UpdatedAt = now 241 _, err = table.InsertOne(ctx, &os) 242 require.NoError(t, err) 243 244 var out overrideStruct 245 err = table.FindOne( 246 ctx, 247 actions.FindOne(). 248 Where( 249 expr.Equal("ID", os.ID), 250 ), 251 ).Decode(&out) 252 require.NoError(t, err) 253 254 require.Equal(t, os.ID, out.ID) 255 require.Equal(t, now, out.CreatedAt) 256 require.Equal(t, now, out.UpdatedAt) 257 require.Equal(t, os.Amount, out.Amount) 258 require.Equal(t, os.CivilDate, out.CivilDate) 259 } 260 } 261 262 // InsertErrorExamples : 263 func InsertErrorExamples(ctx context.Context, t *testing.T, db *sqlike.Database) { 264 var ( 265 ns normalStruct 266 err error 267 ) 268 269 { 270 _, err = db.Table("NormalStruct").InsertOne(ctx, nil) 271 require.Error(t, err) 272 273 var uninitialized *normalStruct 274 _, err = db.Table("NormalStruct").InsertOne(ctx, uninitialized) 275 require.Error(t, err) 276 277 ns = normalStruct{} 278 _, err = db.Table("NormalStruct").InsertOne(ctx, ns) 279 require.Error(t, err) 280 } 281 282 { 283 _, err = db.Table("NormalStruct").Insert( 284 ctx, 285 []normalStruct{}, 286 ) 287 require.Error(t, err) 288 } 289 }