an ORM-free SQL experience

introduce insert statement

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li fef8e27d b3076bea

verified
+106
+106
query.go
··· 321 321 } 322 322 return sql, args 323 323 } 324 + 325 + type insert struct { 326 + into string 327 + or InsertOr 328 + values map[string]any 329 + } 330 + 331 + type InsertOr int 332 + 333 + const ( 334 + None InsertOr = iota 335 + Abort 336 + Fail 337 + Ignore 338 + Replace 339 + Rollback 340 + ) 341 + 342 + func (i InsertOr) String() string { 343 + switch i { 344 + case Abort: 345 + return "ABORT" 346 + case Fail: 347 + return "FAIL" 348 + case Ignore: 349 + return "IGNORE" 350 + case Replace: 351 + return "REPLACE" 352 + case Rollback: 353 + return "ROLLBACK" 354 + default: 355 + return "" 356 + } 357 + } 358 + 359 + func Insert() insert { 360 + return insert{ 361 + values: make(map[string]any), 362 + } 363 + } 364 + 365 + type InsertOpt func(s *insert) 366 + 367 + func (s insert) Into(table string) insert { 368 + s.into = table 369 + return s 370 + } 371 + 372 + func (s insert) Or(option InsertOr) insert { 373 + s.or = option 374 + return s 375 + } 376 + 377 + func (s insert) Value(column string, arg any) insert { 378 + s.values[column] = arg 379 + return s 380 + } 381 + 382 + func (s insert) Build() (string, []any, error) { 383 + var sql strings.Builder 384 + var args []any 385 + 386 + sql.WriteString("INSERT ") 387 + 388 + if s.or != None { 389 + sql.WriteString("OR ") 390 + sql.WriteString(s.or.String()) 391 + } 392 + 393 + if s.into == "" { 394 + return "", nil, fmt.Errorf("INTO clause is required") 395 + } 396 + sql.WriteString(" INTO ") 397 + sql.WriteString(s.into) 398 + 399 + if len(s.values) == 0 { 400 + return "", nil, fmt.Errorf("no values supplied") 401 + } 402 + 403 + sql.WriteString(" (") 404 + 405 + first := true 406 + for col, val := range s.values { 407 + if !first { 408 + sql.WriteString(",") 409 + first = !first 410 + } 411 + 412 + sql.WriteString(col) 413 + args = append(args, val) 414 + } 415 + 416 + sql.WriteString(") VALUES (") 417 + sql.WriteString(strings.TrimSuffix(strings.Repeat("?,", len(s.values)), ",")) 418 + sql.WriteString(")") 419 + 420 + return sql.String(), args, nil 421 + } 422 + 423 + func (s insert) MustBuild() (string, []any) { 424 + sql, args, err := s.Build() 425 + if err != nil { 426 + panic(err) 427 + } 428 + return sql, args 429 + }