diff --git a/generator/templates/client.gotpl b/generator/templates/client.gotpl index 5d31115..4f81194 100644 --- a/generator/templates/client.gotpl +++ b/generator/templates/client.gotpl @@ -23,7 +23,7 @@ type sqliteDialect struct{} func (sqliteDialect) Quote(ident string) string { return `"` + ident + `"` } func (sqliteDialect) BindVar(idx int) string { return "?" } func (sqliteDialect) SupportsReturning() bool { return true } -func (sqliteDialect) SupportsBulkInsert() bool { return false } +func (sqliteDialect) SupportsBulkInsert() bool { return true } func (sqliteDialect) FormatLimitOffset(take *int, skip *int) string { if take != nil { if skip != nil { diff --git a/generator/templates/model_create.gotpl b/generator/templates/model_create.gotpl index 0d0c427..e66e8f6 100644 --- a/generator/templates/model_create.gotpl +++ b/generator/templates/model_create.gotpl @@ -15,11 +15,32 @@ func (s *{{ .Model.Name }}Select) hasAnyRelation() bool { {{- end }} } -func (d *{{ .Model.Name }}Delegate) Create(assignments ...FieldAssignment) *CreateBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { - return &CreateBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.execute{{ .Model.Name }}Create, +type {{ .Model.Name }}CreateBuilder struct { + *CreateBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] +} + +{{ range $field := .Model.ScalarFields }} +{{- $fieldType := trimPrefix $field.GoType "*" }} +{{- if $field.EnumRef }} + {{- if $field.IsArray }} + {{- $fieldType = printf "[]%sType" $field.EnumRef.Name }} + {{- else }} + {{- $fieldType = printf "%sType" $field.EnumRef.Name }} + {{- end }} +{{- end }} +func (b *{{ $.Model.Name }}CreateBuilder) Set{{ capitalize $field.Name }}(v {{ $fieldType }}) *{{ $.Model.Name }}CreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "{{ $field.EffectiveColName }}", Val: v}) + return b +} +{{- end }} + +func (d *{{ .Model.Name }}Delegate) Create(assignments ...FieldAssignment) *{{ .Model.Name }}CreateBuilder { + return &{{ .Model.Name }}CreateBuilder{ + CreateBuilder: &CreateBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.execute{{ .Model.Name }}Create, + }, } } @@ -279,7 +300,11 @@ func (q *Queries) execute{{ .Model.Name }}Create(ctx context.Context, assignment return res, nil } -func (d *{{ .Model.Name }}Delegate) CreateMany(records ...RecordInput) *CreateManyBuilder[{{ .Model.Name }}] { +func (d *{{ .Model.Name }}Delegate) CreateMany(builders ...*{{ .Model.Name }}CreateBuilder) *CreateManyBuilder[{{ .Model.Name }}] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[{{ .Model.Name }}]{ client: d.client, records: records, @@ -287,7 +312,11 @@ func (d *{{ .Model.Name }}Delegate) CreateMany(records ...RecordInput) *CreateMa } } -func (d *{{ .Model.Name }}Delegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { +func (d *{{ .Model.Name }}Delegate) CreateManyAndReturn(builders ...*{{ .Model.Name }}CreateBuilder) *CreateManyAndReturnBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit]{ client: d.client, records: records, diff --git a/generator/templates/model_predicate.gotpl b/generator/templates/model_predicate.gotpl index 6aad4f9..e8719fe 100644 --- a/generator/templates/model_predicate.gotpl +++ b/generator/templates/model_predicate.gotpl @@ -27,6 +27,7 @@ func (p UniquePredicate) Validate() error { type Select = {{ .ParentPackageName }}.{{ .Model.Name }}Select type Omit = {{ .ParentPackageName }}.{{ .Model.Name }}Omit type QueryBuilder = {{ .ParentPackageName }}.{{ .Model.Name }}QueryBuilder +type CreateBuilder = {{ .ParentPackageName }}.{{ .Model.Name }}CreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/create_many_test.go b/integration/create_many_test.go index b1ba779..69ab94f 100644 --- a/integration/create_many_test.go +++ b/integration/create_many_test.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "integration/valk" - "integration/valk/post" "integration/valk/user" "strings" "testing" @@ -26,8 +25,8 @@ func TestCreateMany_Hooks(t *testing.T) { }) count, err := client.User.CreateMany( - user.Record(user.Email.Set("hooked@example.com"), user.PhoneNum.Set("+100000000")), - user.Record(user.Email.Set("normal@example.com"), user.PhoneNum.Set("+200000000")), + client.User.Create().SetEmail("hooked@example.com").SetPhoneNum("+100000000"), + client.User.Create().SetEmail("normal@example.com").SetPhoneNum("+200000000"), ).Exec(ctx) if err != nil { @@ -58,8 +57,8 @@ func TestCreateMany_Hooks(t *testing.T) { }) users, err := client.User.CreateManyAndReturn( - user.Record(user.Email.Set("hooked@example.com"), user.PhoneNum.Set("+100000001")), - user.Record(user.Email.Set("normal@example.com"), user.PhoneNum.Set("+200000001")), + client.User.Create().SetEmail("hooked@example.com").SetPhoneNum("+100000001"), + client.User.Create().SetEmail("normal@example.com").SetPhoneNum("+200000001"), ).Exec(ctx) if err != nil { @@ -88,8 +87,8 @@ func TestCreateMany_Hooks(t *testing.T) { }) _, err := client.User.CreateMany( - user.Record(user.Email.Set("good@example.com"), user.PhoneNum.Set("+300000000")), - user.Record(user.Email.Set("reject@example.com"), user.PhoneNum.Set("+300000001")), + client.User.Create().SetEmail("good@example.com").SetPhoneNum("+300000000"), + client.User.Create().SetEmail("reject@example.com").SetPhoneNum("+300000001"), ).Exec(ctx) if err == nil { @@ -118,7 +117,7 @@ func TestCreateMany_Hooks(t *testing.T) { }) users, err := client.User.CreateManyAndReturn( - user.Record(user.Email.Set("after@example.com"), user.PhoneNum.Set("+500000000")), + client.User.Create().SetEmail("after@example.com").SetPhoneNum("+500000000"), ).Exec(ctx) if err != nil { @@ -148,7 +147,7 @@ func TestCreateMany_Hooks(t *testing.T) { prevCount := count _, err := client.User.CreateManyAndReturn( - user.Record(user.Email.Set("aftershoot@example.com"), user.PhoneNum.Set("+600000000")), + client.User.Create().SetEmail("aftershoot@example.com").SetPhoneNum("+600000000"), ).Exec(ctx) if err == nil { @@ -177,14 +176,8 @@ func TestCreateMany_Hooks(t *testing.T) { }) count, err := client.User.CreateMany( - user.Record( - user.Email.Set("bulk1@example.com"), - user.PhoneNum.Set("+700000001"), - ), - user.Record( - user.Email.Set("bulk2@example.com"), - user.PhoneNum.Set("+700000002"), - ), + client.User.Create().SetEmail("bulk1@example.com").SetPhoneNum("+700000001"), + client.User.Create().SetEmail("bulk2@example.com").SetPhoneNum("+700000002"), ).Exec(ctx) if err != nil { @@ -216,10 +209,7 @@ func TestCreateMany_Hooks(t *testing.T) { }) _, err := client.User.CreateMany( - user.Record( - user.Email.Set("ghost@example.com"), - user.PhoneNum.Set("+800000000"), - ), + client.User.Create().SetEmail("ghost@example.com").SetPhoneNum("+800000000"), ).Exec(ctx) if err == nil { @@ -247,9 +237,9 @@ func TestCreateMany(t *testing.T) { t.Run("CreateMany returns correct count", func(t *testing.T) { count, err := client.User.CreateMany( - user.Record(user.Email.Set("bulk1@example.com"), user.PhoneNum.Set("+111")), - user.Record(user.Email.Set("bulk2@example.com"), user.PhoneNum.Set("+222")), - user.Record(user.Email.Set("bulk3@example.com"), user.PhoneNum.Set("+333")), + client.User.Create().SetEmail("bulk1@example.com").SetPhoneNum("+111"), + client.User.Create().SetEmail("bulk2@example.com").SetPhoneNum("+222"), + client.User.Create().SetEmail("bulk3@example.com").SetPhoneNum("+333"), ).Exec(ctx) if err != nil { @@ -280,8 +270,8 @@ func TestCreateMany(t *testing.T) { } posts, err := client.Post.CreateManyAndReturn( - post.Record(post.Title.Set("Post One"), post.AuthorId.Set(author.Id)), - post.Record(post.Title.Set("Post Two"), post.AuthorId.Set(author.Id)), + client.Post.Create().SetTitle("Post One").SetAuthorId(author.Id), + client.Post.Create().SetTitle("Post Two").SetAuthorId(author.Id), ).Select(valk.PostSelect{ Id: true, Title: true, diff --git a/integration/main.go b/integration/main.go index 916bf85..d1144b7 100644 --- a/integration/main.go +++ b/integration/main.go @@ -29,6 +29,60 @@ type SeedData struct { Meta2 json.RawMessage } +func dbReset(db *valk.DB) error { + tx, err := db.Raw().Begin() + if err != nil { + return err + } + defer tx.Rollback() + + if _, err := tx.Exec(`DROP SCHEMA public CASCADE`); err != nil { + return err + } + + if _, err := tx.Exec(`CREATE SCHEMA public`); err != nil { + return err + } + + return tx.Commit() +} + +func main() { + + err := godotenv.Load() + if err != nil { + log.Fatal("Error loading .env file") + } + // db := openConn() + db := openPGConn() + defer dbReset(db) + defer db.Close() + var test user.CreateBuilder + _ = test + rawDB := db.Raw() + rawDB.SetMaxOpenConns(10) + ctx := context.Background() + + runMigrations(db, ctx) + + var builders []*user.CreateBuilder + for i := range 20 { + builder := db.User.Create(). + SetEmail(fmt.Sprintf("user%d@gmail.com", i)). + SetPassword(fmt.Sprintf("pass%d", i)). + SetPhoneNum(fmt.Sprintf("+1111%d", i)) + + builders = append(builders, builder) + } + count, err := db.User.CreateMany(builders...).Exec(ctx) + if err != nil { + log.Fatalf("failed to seed users: %v", err) + } + + printJSON(count) + +} + func seed(db *valk.DB, ctx context.Context) *SeedData { db.User.BeforeCreate(func(ctx context.Context, user *valk.UserCreate) error { @@ -51,14 +105,14 @@ func seed(db *valk.DB, ctx context.Context) *SeedData { return nil }) - var usersToCreate []valk.RecordInput + var usersToCreate []*user.CreateBuilder for i := range 20 { - usersToCreate = append(usersToCreate, user.Record( - user.Email.Set(fmt.Sprintf("email-%d", i)), - user.PhoneNum.Set(fmt.Sprintf("555-%d", i)), - user.Password.Set(fmt.Sprintf("password-%d", i)), - )) + usersToCreate = append(usersToCreate, db.User.Create(). + SetEmail(fmt.Sprintf("email-%d", i)). + SetPhoneNum(fmt.Sprintf("555-%d", i)). + SetPassword(fmt.Sprintf("password-%d", i)), + ) } _, err := db.User.FindUnique( @@ -91,16 +145,14 @@ func seed(db *valk.DB, ctx context.Context) *SeedData { fmt.Printf("CreateManyAndReturn: %d users returned with auto-generated IDs\n", len(users)) if _, err := db.User.CreateMany( - user.Record( - user.Email.Set("test"), - user.PhoneNum.Set("555-test"), - user.Password.Set("passwd"), - ), - user.Record( - user.Email.Set("again"), - user.PhoneNum.Set("555-again"), - user.Password.Set("123456"), - ), + db.User.Create(). + SetEmail("test"). + SetPhoneNum("555-test"). + SetPassword("passwd"), + db.User.Create(). + SetEmail("again"). + SetPhoneNum("555-again"). + SetPassword("123456"), ).Exec(ctx); err != nil { log.Fatalf("failed to CreateMany: %v", err) } @@ -218,33 +270,6 @@ func seed(db *valk.DB, ctx context.Context) *SeedData { } } -func main() { - - err := godotenv.Load() - if err != nil { - log.Fatal("Error loading .env file") - } - // db := openConn() - db := openPGConn() - defer db.Close() - - rawDB := db.Raw() - rawDB.SetMaxOpenConns(10) - ctx := context.Background() - - runMigrations(db, ctx) - res, err := db.User.FindUnique( - user.EmailPhoneUnique("x@y.com", "+1111"), - user.RoleOptional.EQ(valk.UserRole.Admin), - ).Exec(ctx) - if err != nil { - log.Fatalf("failed to find user: %v", err) - } - fmt.Println(res) - printJSON(res) - -} - func openConn() *valk.DB { db, err := valk.Open("sqlite", "file::memory:?_pragma=foreign_keys(1)&_time_format=sqlite") diff --git a/integration/postgres_defaults_test.go b/integration/postgres_defaults_test.go index 5069308..2b05339 100644 --- a/integration/postgres_defaults_test.go +++ b/integration/postgres_defaults_test.go @@ -838,15 +838,13 @@ func TestNativeDefaults_CreateMany(t *testing.T) { base := baseAllFields(t) - rec1 := allFieldsSoFar.Record(append(base, - allFieldsSoFar.StringReq.Set("many-1"), - allFieldsSoFar.IntReq.Set(10), - )...) + rec1 := db.AllFieldsSoFar.Create(base...). + SetStringReq("many-1"). + SetIntReq(10) - rec2 := allFieldsSoFar.Record(append(base, - allFieldsSoFar.StringReq.Set("many-2"), - allFieldsSoFar.IntReq.Set(20), - )...) + rec2 := db.AllFieldsSoFar.Create(base...). + SetStringReq("many-2"). + SetIntReq(20) count, err := db.AllFieldsSoFar.CreateMany(rec1, rec2).Exec(ctx) if err != nil { @@ -865,14 +863,8 @@ func TestNativeDefaults_CreateManyAndReturn(t *testing.T) { base := baseAllFields(t) recs, err := db.AllFieldsSoFar.CreateManyAndReturn( - allFieldsSoFar.Record(append(base, - allFieldsSoFar.StringReq.Set("ret-1"), - allFieldsSoFar.IntReq.Set(100), - )...), - allFieldsSoFar.Record(append(base, - allFieldsSoFar.StringReq.Set("ret-2"), - allFieldsSoFar.IntReq.Set(200), - )...), + db.AllFieldsSoFar.Create(base...).SetStringReq("ret-1").SetIntReq(100), + db.AllFieldsSoFar.Create(base...).SetStringReq("ret-2").SetIntReq(200), ).Exec(ctx) if err != nil { @@ -955,14 +947,8 @@ func TestNativeDefaults_Hooks(t *testing.T) { }) base := baseAllFields(t) - r1 := allFieldsSoFar.Record(append(base, - allFieldsSoFar.StringReq.Set("hook-cm-1"), - allFieldsSoFar.IntReq.Set(1), - )...) - r2 := allFieldsSoFar.Record(append(base, - allFieldsSoFar.StringReq.Set("hook-cm-2"), - allFieldsSoFar.IntReq.Set(2), - )...) + r1 := db.AllFieldsSoFar.Create(base...).SetStringReq("hook-cm-1").SetIntReq(1) + r2 := db.AllFieldsSoFar.Create(base...).SetStringReq("hook-cm-2").SetIntReq(2) _, err := db.AllFieldsSoFar.CreateMany(r1, r2).Exec(ctx) if err != nil { diff --git a/integration/read_test.go b/integration/read_test.go index af7b44f..a2b488b 100644 --- a/integration/read_test.go +++ b/integration/read_test.go @@ -593,13 +593,13 @@ func TestFindManyTakeAndSkip(t *testing.T) { defer cleanup() ctx := context.Background() - var usersToCreate []valk.RecordInput + var usersToCreate []*user.CreateBuilder for i := range 5 { - usersToCreate = append(usersToCreate, user.Record( - user.Email.Set(fmt.Sprintf("user%d@example.com", i)), - user.PhoneNum.Set(fmt.Sprintf("99%d", i)), - )) + usersToCreate = append(usersToCreate, db.User.Create(). + SetEmail(fmt.Sprintf("user%d@example.com", i)). + SetPhoneNum(fmt.Sprintf("99%d", i)), + ) } _, err := db.User.CreateMany(usersToCreate...).Exec(ctx) @@ -638,12 +638,12 @@ func TestFindFirstSkip(t *testing.T) { defer cleanup() ctx := context.Background() - var usersToCreate []valk.RecordInput + var usersToCreate []*user.CreateBuilder for i := range 5 { - usersToCreate = append(usersToCreate, user.Record( - user.Email.Set(fmt.Sprintf("ff_user%d@example.com", i)), - user.PhoneNum.Set(fmt.Sprintf("88%d", i)), - )) + usersToCreate = append(usersToCreate, db.User.Create(). + SetEmail(fmt.Sprintf("ff_user%d@example.com", i)). + SetPhoneNum(fmt.Sprintf("88%d", i)), + ) } _, err := db.User.CreateMany(usersToCreate...).Exec(ctx) if err != nil { diff --git a/integration/valk.json b/integration/valk.json index 19b7b33..6d6a467 100644 --- a/integration/valk.json +++ b/integration/valk.json @@ -10,5 +10,5 @@ "client": "./valk", "migrations": "./valk/migrations" }, - "log":["query"] + "log":["all"] } \ No newline at end of file diff --git a/integration/valk/allFieldsSoFar.go b/integration/valk/allFieldsSoFar.go index e7a871f..aaf8ce4 100644 --- a/integration/valk/allFieldsSoFar.go +++ b/integration/valk/allFieldsSoFar.go @@ -632,11 +632,234 @@ func (s *AllFieldsSoFarSelect) hasAnyRelation() bool { return false } -func (d *AllFieldsSoFarDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { - return &CreateBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executeAllFieldsSoFarCreate, +type AllFieldsSoFarCreateBuilder struct { + *CreateBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] +} + +func (b *AllFieldsSoFarCreateBuilder) SetId(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "id", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetStringReq(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "stringReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetStringOpt(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "stringOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetStringDefault(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "stringDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetStringVarchar(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "stringVarchar", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetStringChar(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "stringChar", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBitVal(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "bitVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetVarBitVal(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "varBitVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetInetVal(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "inetVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetXmlVal(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "xmlVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetCuidDefault(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "cuidDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetCuid1Default(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "cuid1Default", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetCuid2Default(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "cuid2Default", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetUuidDefault(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "uuidDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetUuid4Default(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "uuid4Default", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetUuid7Default(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "uuid7Default", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetUlidDefault(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "ulidDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetNanoidDefault(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "nanoidDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetUuidDb(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "uuidDb", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetIntReq(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "intReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetIntOpt(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "intOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetIntDefault(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "intDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetIntegerVal(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "integerVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetSmallInt(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "smallInt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetTinyInt(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "tinyInt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetOidVal(v int32) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "oidVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBigIntReq(v int64) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "bigIntReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBigIntOpt(v int64) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "bigIntOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetFloatReq(v float64) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "floatReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetFloatOpt(v float64) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "floatOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetRealVal(v float64) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "realVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetDecimalReq(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "decimalReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetDecimalOpt(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "decimalOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetDecimalPrecise(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "decimalPrecise", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetMoneyVal(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "moneyVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBoolReq(v bool) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "boolReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBoolOpt(v bool) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "boolOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBoolDefault(v bool) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "boolDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetDateTimeReq(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "dateTimeReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetDateTimeOpt(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "dateTimeOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetDateTimeDefault(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "dateTimeDefault", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetUpdatedAt(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "updatedAt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetDateTimeTz(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "dateTimeTz", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetTimestampVal(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "timestampVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetTimeVal(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "timeVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetTimetzVal(v time.Time) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "timetzVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetJsonReq(v json.RawMessage) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "jsonReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetJsonOpt(v json.RawMessage) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "jsonOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetJsonVal(v json.RawMessage) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "jsonVal", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBytesReq(v []byte) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "bytesReq", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetBytesOpt(v []byte) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "bytesOpt", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetHstoreField(v map[string]*string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "hstoreField", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetLtreeField(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "ltreeField", Val: v}) + return b +} +func (b *AllFieldsSoFarCreateBuilder) SetCitextField(v string) *AllFieldsSoFarCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "citextField", Val: v}) + return b +} + +func (d *AllFieldsSoFarDelegate) Create(assignments ...FieldAssignment) *AllFieldsSoFarCreateBuilder { + return &AllFieldsSoFarCreateBuilder{ + CreateBuilder: &CreateBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executeAllFieldsSoFarCreate, + }, } } @@ -1440,7 +1663,11 @@ func (q *Queries) executeAllFieldsSoFarCreate(ctx context.Context, assignments [ return res, nil } -func (d *AllFieldsSoFarDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[AllFieldsSoFar] { +func (d *AllFieldsSoFarDelegate) CreateMany(builders ...*AllFieldsSoFarCreateBuilder) *CreateManyBuilder[AllFieldsSoFar] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[AllFieldsSoFar]{ client: d.client, records: records, @@ -1448,7 +1675,11 @@ func (d *AllFieldsSoFarDelegate) CreateMany(records ...RecordInput) *CreateManyB } } -func (d *AllFieldsSoFarDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { +func (d *AllFieldsSoFarDelegate) CreateManyAndReturn(builders ...*AllFieldsSoFarCreateBuilder) *CreateManyAndReturnBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit]{ client: d.client, records: records, diff --git a/integration/valk/allFieldsSoFar/allFieldsSoFar.go b/integration/valk/allFieldsSoFar/allFieldsSoFar.go index 7f2d0f2..01bae05 100644 --- a/integration/valk/allFieldsSoFar/allFieldsSoFar.go +++ b/integration/valk/allFieldsSoFar/allFieldsSoFar.go @@ -23,6 +23,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.AllFieldsSoFarSelect type Omit = valk.AllFieldsSoFarOmit type QueryBuilder = valk.AllFieldsSoFarQueryBuilder +type CreateBuilder = valk.AllFieldsSoFarCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/valk/category.go b/integration/valk/category.go index 9041fce..aea1711 100644 --- a/integration/valk/category.go +++ b/integration/valk/category.go @@ -164,11 +164,26 @@ func (s *CategorySelect) hasAnyRelation() bool { return s.Posts != nil } -func (d *CategoryDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[Category, CategorySelect, CategoryOmit] { - return &CreateBuilder[Category, CategorySelect, CategoryOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executeCategoryCreate, +type CategoryCreateBuilder struct { + *CreateBuilder[Category, CategorySelect, CategoryOmit] +} + +func (b *CategoryCreateBuilder) SetId(v int32) *CategoryCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "id", Val: v}) + return b +} +func (b *CategoryCreateBuilder) SetName(v string) *CategoryCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "name", Val: v}) + return b +} + +func (d *CategoryDelegate) Create(assignments ...FieldAssignment) *CategoryCreateBuilder { + return &CategoryCreateBuilder{ + CreateBuilder: &CreateBuilder[Category, CategorySelect, CategoryOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executeCategoryCreate, + }, } } @@ -289,7 +304,11 @@ func (q *Queries) executeCategoryCreate(ctx context.Context, assignments []Field return res, nil } -func (d *CategoryDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[Category] { +func (d *CategoryDelegate) CreateMany(builders ...*CategoryCreateBuilder) *CreateManyBuilder[Category] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[Category]{ client: d.client, records: records, @@ -297,7 +316,11 @@ func (d *CategoryDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder } } -func (d *CategoryDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[Category, CategorySelect, CategoryOmit] { +func (d *CategoryDelegate) CreateManyAndReturn(builders ...*CategoryCreateBuilder) *CreateManyAndReturnBuilder[Category, CategorySelect, CategoryOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[Category, CategorySelect, CategoryOmit]{ client: d.client, records: records, diff --git a/integration/valk/category/category.go b/integration/valk/category/category.go index 7e8fa63..6abd473 100644 --- a/integration/valk/category/category.go +++ b/integration/valk/category/category.go @@ -21,6 +21,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.CategorySelect type Omit = valk.CategoryOmit type QueryBuilder = valk.CategoryQueryBuilder +type CreateBuilder = valk.CategoryCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/valk/categoryToPost.go b/integration/valk/categoryToPost.go index 0189a75..c8b8561 100644 --- a/integration/valk/categoryToPost.go +++ b/integration/valk/categoryToPost.go @@ -166,11 +166,26 @@ func (s *CategoryToPostSelect) hasAnyRelation() bool { return s.Post != nil || s.Category != nil } -func (d *CategoryToPostDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { - return &CreateBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executeCategoryToPostCreate, +type CategoryToPostCreateBuilder struct { + *CreateBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] +} + +func (b *CategoryToPostCreateBuilder) SetPostId(v string) *CategoryToPostCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "postId", Val: v}) + return b +} +func (b *CategoryToPostCreateBuilder) SetCategoryId(v int32) *CategoryToPostCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "categoryId", Val: v}) + return b +} + +func (d *CategoryToPostDelegate) Create(assignments ...FieldAssignment) *CategoryToPostCreateBuilder { + return &CategoryToPostCreateBuilder{ + CreateBuilder: &CreateBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executeCategoryToPostCreate, + }, } } @@ -292,7 +307,11 @@ func (q *Queries) executeCategoryToPostCreate(ctx context.Context, assignments [ return res, nil } -func (d *CategoryToPostDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[CategoryToPost] { +func (d *CategoryToPostDelegate) CreateMany(builders ...*CategoryToPostCreateBuilder) *CreateManyBuilder[CategoryToPost] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[CategoryToPost]{ client: d.client, records: records, @@ -300,7 +319,11 @@ func (d *CategoryToPostDelegate) CreateMany(records ...RecordInput) *CreateManyB } } -func (d *CategoryToPostDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { +func (d *CategoryToPostDelegate) CreateManyAndReturn(builders ...*CategoryToPostCreateBuilder) *CreateManyAndReturnBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit]{ client: d.client, records: records, diff --git a/integration/valk/categoryToPost/categoryToPost.go b/integration/valk/categoryToPost/categoryToPost.go index 5f132e8..ffe2d97 100644 --- a/integration/valk/categoryToPost/categoryToPost.go +++ b/integration/valk/categoryToPost/categoryToPost.go @@ -21,6 +21,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.CategoryToPostSelect type Omit = valk.CategoryToPostOmit type QueryBuilder = valk.CategoryToPostQueryBuilder +type CreateBuilder = valk.CategoryToPostCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/valk/client.go b/integration/valk/client.go index 2f4ff1c..a896c95 100644 --- a/integration/valk/client.go +++ b/integration/valk/client.go @@ -556,6 +556,7 @@ func (db *DB) Raw() *sql.DB { // RunMigrations runs all pending migrations from the embedded folder. func (db *DB) RunMigrations(ctx context.Context) error { + log.Println("Running migrations...") if err := goose.SetDialect(db.provider); err != nil { return err } @@ -563,8 +564,10 @@ func (db *DB) RunMigrations(ctx context.Context) error { goose.SetBaseFS(migrationsFS) err := goose.UpContext(ctx, db.sqlDB, "migrations") if err != nil { + log.Printf("Migrations failed: %v", err) return err } + log.Println("Migrations completed successfully.") return nil } @@ -586,6 +589,9 @@ func (q *Queries) bindVars(count int) string { func (q *Queries) query(ctx context.Context, query string, args ...any) (*sql.Rows, error) { log.Printf("[%s] SQL Query: %s | Args: %v", strings.ToUpper(q.provider), query, args) res, err := q.db.QueryContext(ctx, query, args...) + if err != nil { + log.Printf("[%s] SQL Error: %v | Query: %s | Args: %v", strings.ToUpper(q.provider), err, query, args) + } return res, err } @@ -597,6 +603,9 @@ func (q *Queries) queryRow(ctx context.Context, query string, args ...any) *sql. func (q *Queries) exec(ctx context.Context, query string, args ...any) (sql.Result, error) { log.Printf("[%s] SQL Exec: %s | Args: %v", strings.ToUpper(q.provider), query, args) res, err := q.db.ExecContext(ctx, query, args...) + if err != nil { + log.Printf("[%s] SQL Error: %v | Query: %s | Args: %v", strings.ToUpper(q.provider), err, query, args) + } return res, err } diff --git a/integration/valk/comment.go b/integration/valk/comment.go index 0117498..1e4de17 100644 --- a/integration/valk/comment.go +++ b/integration/valk/comment.go @@ -221,11 +221,50 @@ func (s *CommentSelect) hasAnyRelation() bool { return s.Post != nil || s.Author != nil } -func (d *CommentDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[Comment, CommentSelect, CommentOmit] { - return &CreateBuilder[Comment, CommentSelect, CommentOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executeCommentCreate, +type CommentCreateBuilder struct { + *CreateBuilder[Comment, CommentSelect, CommentOmit] +} + +func (b *CommentCreateBuilder) SetId(v string) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "id", Val: v}) + return b +} +func (b *CommentCreateBuilder) SetTextify(v int32) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "textify", Val: v}) + return b +} +func (b *CommentCreateBuilder) SetDummy3(v string) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "dummy3", Val: v}) + return b +} +func (b *CommentCreateBuilder) SetDummy1(v int32) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "dummy1", Val: v}) + return b +} +func (b *CommentCreateBuilder) SetDummy2(v string) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "dummy2", Val: v}) + return b +} +func (b *CommentCreateBuilder) SetPostId(v string) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "postId", Val: v}) + return b +} +func (b *CommentCreateBuilder) SetAuthorId(v string) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "authorId", Val: v}) + return b +} +func (b *CommentCreateBuilder) SetMeta(v json.RawMessage) *CommentCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "meta", Val: v}) + return b +} + +func (d *CommentDelegate) Create(assignments ...FieldAssignment) *CommentCreateBuilder { + return &CommentCreateBuilder{ + CreateBuilder: &CreateBuilder[Comment, CommentSelect, CommentOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executeCommentCreate, + }, } } @@ -429,7 +468,11 @@ func (q *Queries) executeCommentCreate(ctx context.Context, assignments []FieldA return res, nil } -func (d *CommentDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[Comment] { +func (d *CommentDelegate) CreateMany(builders ...*CommentCreateBuilder) *CreateManyBuilder[Comment] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[Comment]{ client: d.client, records: records, @@ -437,7 +480,11 @@ func (d *CommentDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[ } } -func (d *CommentDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[Comment, CommentSelect, CommentOmit] { +func (d *CommentDelegate) CreateManyAndReturn(builders ...*CommentCreateBuilder) *CreateManyAndReturnBuilder[Comment, CommentSelect, CommentOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[Comment, CommentSelect, CommentOmit]{ client: d.client, records: records, diff --git a/integration/valk/comment/comment.go b/integration/valk/comment/comment.go index b4966bf..48ea007 100644 --- a/integration/valk/comment/comment.go +++ b/integration/valk/comment/comment.go @@ -22,6 +22,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.CommentSelect type Omit = valk.CommentOmit type QueryBuilder = valk.CommentQueryBuilder +type CreateBuilder = valk.CommentCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/valk/defaultsTest.go b/integration/valk/defaultsTest.go index 934eebe..ba30c61 100644 --- a/integration/valk/defaultsTest.go +++ b/integration/valk/defaultsTest.go @@ -226,11 +226,54 @@ func (s *DefaultsTestSelect) hasAnyRelation() bool { return false } -func (d *DefaultsTestDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { - return &CreateBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executeDefaultsTestCreate, +type DefaultsTestCreateBuilder struct { + *CreateBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] +} + +func (b *DefaultsTestCreateBuilder) SetUuid4(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "uuid4", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetUuid7(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "uuid7", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetUuidNoArgs(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "uuidNoArgs", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetCuid1(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "cuid1", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetCuid2(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "cuid2", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetCuidNoArgs(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "cuidNoArgs", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetUlid(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "ulid", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetNanoid(v string) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "nanoid", Val: v}) + return b +} +func (b *DefaultsTestCreateBuilder) SetNow(v time.Time) *DefaultsTestCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "now", Val: v}) + return b +} + +func (d *DefaultsTestDelegate) Create(assignments ...FieldAssignment) *DefaultsTestCreateBuilder { + return &DefaultsTestCreateBuilder{ + CreateBuilder: &CreateBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executeDefaultsTestCreate, + }, } } @@ -457,7 +500,11 @@ func (q *Queries) executeDefaultsTestCreate(ctx context.Context, assignments []F return res, nil } -func (d *DefaultsTestDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[DefaultsTest] { +func (d *DefaultsTestDelegate) CreateMany(builders ...*DefaultsTestCreateBuilder) *CreateManyBuilder[DefaultsTest] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[DefaultsTest]{ client: d.client, records: records, @@ -465,7 +512,11 @@ func (d *DefaultsTestDelegate) CreateMany(records ...RecordInput) *CreateManyBui } } -func (d *DefaultsTestDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { +func (d *DefaultsTestDelegate) CreateManyAndReturn(builders ...*DefaultsTestCreateBuilder) *CreateManyAndReturnBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit]{ client: d.client, records: records, diff --git a/integration/valk/defaultsTest/defaultsTest.go b/integration/valk/defaultsTest/defaultsTest.go index b138eb8..769deb1 100644 --- a/integration/valk/defaultsTest/defaultsTest.go +++ b/integration/valk/defaultsTest/defaultsTest.go @@ -22,6 +22,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.DefaultsTestSelect type Omit = valk.DefaultsTestOmit type QueryBuilder = valk.DefaultsTestQueryBuilder +type CreateBuilder = valk.DefaultsTestCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/valk/post.go b/integration/valk/post.go index 374657d..d2b38d6 100644 --- a/integration/valk/post.go +++ b/integration/valk/post.go @@ -195,11 +195,38 @@ func (s *PostSelect) hasAnyRelation() bool { return s.Author != nil || s.Comments != nil || s.Categories != nil } -func (d *PostDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[Post, PostSelect, PostOmit] { - return &CreateBuilder[Post, PostSelect, PostOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executePostCreate, +type PostCreateBuilder struct { + *CreateBuilder[Post, PostSelect, PostOmit] +} + +func (b *PostCreateBuilder) SetId(v string) *PostCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "id", Val: v}) + return b +} +func (b *PostCreateBuilder) SetTitle(v string) *PostCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "title", Val: v}) + return b +} +func (b *PostCreateBuilder) SetContent(v string) *PostCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "content", Val: v}) + return b +} +func (b *PostCreateBuilder) SetPublished(v bool) *PostCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "published", Val: v}) + return b +} +func (b *PostCreateBuilder) SetAuthorId(v string) *PostCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "authorId", Val: v}) + return b +} + +func (d *PostDelegate) Create(assignments ...FieldAssignment) *PostCreateBuilder { + return &PostCreateBuilder{ + CreateBuilder: &CreateBuilder[Post, PostSelect, PostOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executePostCreate, + }, } } @@ -360,7 +387,11 @@ func (q *Queries) executePostCreate(ctx context.Context, assignments []FieldAssi return res, nil } -func (d *PostDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[Post] { +func (d *PostDelegate) CreateMany(builders ...*PostCreateBuilder) *CreateManyBuilder[Post] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[Post]{ client: d.client, records: records, @@ -368,7 +399,11 @@ func (d *PostDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[Pos } } -func (d *PostDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[Post, PostSelect, PostOmit] { +func (d *PostDelegate) CreateManyAndReturn(builders ...*PostCreateBuilder) *CreateManyAndReturnBuilder[Post, PostSelect, PostOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[Post, PostSelect, PostOmit]{ client: d.client, records: records, diff --git a/integration/valk/post/post.go b/integration/valk/post/post.go index 177a271..216503e 100644 --- a/integration/valk/post/post.go +++ b/integration/valk/post/post.go @@ -21,6 +21,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.PostSelect type Omit = valk.PostOmit type QueryBuilder = valk.PostQueryBuilder +type CreateBuilder = valk.PostCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/valk/profile.go b/integration/valk/profile.go index 3fe1128..f1a8600 100644 --- a/integration/valk/profile.go +++ b/integration/valk/profile.go @@ -183,11 +183,34 @@ func (s *ProfileSelect) hasAnyRelation() bool { return s.User != nil } -func (d *ProfileDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[Profile, ProfileSelect, ProfileOmit] { - return &CreateBuilder[Profile, ProfileSelect, ProfileOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executeProfileCreate, +type ProfileCreateBuilder struct { + *CreateBuilder[Profile, ProfileSelect, ProfileOmit] +} + +func (b *ProfileCreateBuilder) SetId(v string) *ProfileCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "id", Val: v}) + return b +} +func (b *ProfileCreateBuilder) SetBio(v string) *ProfileCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "bio", Val: v}) + return b +} +func (b *ProfileCreateBuilder) SetUserId(v string) *ProfileCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "userId", Val: v}) + return b +} +func (b *ProfileCreateBuilder) SetCreatedAt(v time.Time) *ProfileCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "createdAt", Val: v}) + return b +} + +func (d *ProfileDelegate) Create(assignments ...FieldAssignment) *ProfileCreateBuilder { + return &ProfileCreateBuilder{ + CreateBuilder: &CreateBuilder[Profile, ProfileSelect, ProfileOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executeProfileCreate, + }, } } @@ -336,7 +359,11 @@ func (q *Queries) executeProfileCreate(ctx context.Context, assignments []FieldA return res, nil } -func (d *ProfileDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[Profile] { +func (d *ProfileDelegate) CreateMany(builders ...*ProfileCreateBuilder) *CreateManyBuilder[Profile] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[Profile]{ client: d.client, records: records, @@ -344,7 +371,11 @@ func (d *ProfileDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[ } } -func (d *ProfileDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[Profile, ProfileSelect, ProfileOmit] { +func (d *ProfileDelegate) CreateManyAndReturn(builders ...*ProfileCreateBuilder) *CreateManyAndReturnBuilder[Profile, ProfileSelect, ProfileOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[Profile, ProfileSelect, ProfileOmit]{ client: d.client, records: records, diff --git a/integration/valk/profile/profile.go b/integration/valk/profile/profile.go index 7c9dc71..6fcdd67 100644 --- a/integration/valk/profile/profile.go +++ b/integration/valk/profile/profile.go @@ -22,6 +22,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.ProfileSelect type Omit = valk.ProfileOmit type QueryBuilder = valk.ProfileQueryBuilder +type CreateBuilder = valk.ProfileCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{} diff --git a/integration/valk/user.go b/integration/valk/user.go index 8e09b4f..666e395 100644 --- a/integration/valk/user.go +++ b/integration/valk/user.go @@ -217,11 +217,46 @@ func (s *UserSelect) hasAnyRelation() bool { return s.Profile != nil || s.Posts != nil || s.Comments != nil || s.ReferredBy != nil || s.Referrals != nil } -func (d *UserDelegate) Create(assignments ...FieldAssignment) *CreateBuilder[User, UserSelect, UserOmit] { - return &CreateBuilder[User, UserSelect, UserOmit]{ - client: d.client, - assignments: assignments, - execFunc: d.client.executeUserCreate, +type UserCreateBuilder struct { + *CreateBuilder[User, UserSelect, UserOmit] +} + +func (b *UserCreateBuilder) SetId(v string) *UserCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "id", Val: v}) + return b +} +func (b *UserCreateBuilder) SetEmail(v string) *UserCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "email", Val: v}) + return b +} +func (b *UserCreateBuilder) SetPhoneNum(v string) *UserCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "phoneNum", Val: v}) + return b +} +func (b *UserCreateBuilder) SetPassword(v string) *UserCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "password", Val: v}) + return b +} +func (b *UserCreateBuilder) SetRole(v UserRoleType) *UserCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "role", Val: v}) + return b +} +func (b *UserCreateBuilder) SetRoleOptional(v UserRoleType) *UserCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "roleOptional", Val: v}) + return b +} +func (b *UserCreateBuilder) SetReferredById(v string) *UserCreateBuilder { + b.assignments = append(b.assignments, FieldAssignment{Col: "referredById", Val: v}) + return b +} + +func (d *UserDelegate) Create(assignments ...FieldAssignment) *UserCreateBuilder { + return &UserCreateBuilder{ + CreateBuilder: &CreateBuilder[User, UserSelect, UserOmit]{ + client: d.client, + assignments: assignments, + execFunc: d.client.executeUserCreate, + }, } } @@ -414,7 +449,11 @@ func (q *Queries) executeUserCreate(ctx context.Context, assignments []FieldAssi return res, nil } -func (d *UserDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[User] { +func (d *UserDelegate) CreateMany(builders ...*UserCreateBuilder) *CreateManyBuilder[User] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyBuilder[User]{ client: d.client, records: records, @@ -422,7 +461,11 @@ func (d *UserDelegate) CreateMany(records ...RecordInput) *CreateManyBuilder[Use } } -func (d *UserDelegate) CreateManyAndReturn(records ...RecordInput) *CreateManyAndReturnBuilder[User, UserSelect, UserOmit] { +func (d *UserDelegate) CreateManyAndReturn(builders ...*UserCreateBuilder) *CreateManyAndReturnBuilder[User, UserSelect, UserOmit] { + records := make([]RecordInput, len(builders)) + for i, b := range builders { + records[i] = RecordInput{Assignments: b.assignments} + } return &CreateManyAndReturnBuilder[User, UserSelect, UserOmit]{ client: d.client, records: records, diff --git a/integration/valk/user/user.go b/integration/valk/user/user.go index f52ecbd..07fa367 100644 --- a/integration/valk/user/user.go +++ b/integration/valk/user/user.go @@ -21,6 +21,7 @@ func (p UniquePredicate) Validate() error { type Select = valk.UserSelect type Omit = valk.UserOmit type QueryBuilder = valk.UserQueryBuilder +type CreateBuilder = valk.UserCreateBuilder func Query() *QueryBuilder { return &QueryBuilder{}