//nolint:lll // sql statements are long package db_test import ( dbsql "database/sql" "fmt" dbv2 "git.fsdpf.net/go/db/v2" _ "git.fsdpf.net/go/db/v2/dialect/mysql" "git.fsdpf.net/go/db/v2/exp" ) func ExampleUpdate_withStruct() { type item struct { Address string `db:"address"` Name string `db:"name"` } sql, args, _ := dbv2.Update("items").Set( item{Name: "Test", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdate_withOmitNilTag() { type item struct { FirstName string `db:"first_name" ff:"omitnil"` LastName string `db:"last_name" ff:"omitnil"` Address1 *string `db:"address1" ff:"omitnil"` Address2 *string `db:"address2" ff:"omitnil"` Address3 *string `db:"address3" ff:"omitnil"` } address1 := "113 Test Addr" var emptyString string sql, args, _ := dbv2.Update("items").Set( item{ FirstName: "Test First Name", LastName: "", Address1: &address1, Address2: &emptyString, Address3: nil, // will omit nil pointer }, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address1"='113 Test Addr',"address2"='',"first_name"='Test First Name',"last_name"='' [] } func ExampleUpdate_withOmitEmptyTag() { type item struct { FirstName string `db:"first_name" ff:"omitempty"` LastName string `db:"last_name" ff:"omitempty"` Address1 *string `db:"address1" ff:"omitempty"` Address2 *string `db:"address2" ff:"omitempty"` Address3 *string `db:"address3" ff:"omitempty"` } address1 := "114 Test Addr" var emptyString string sql, args, _ := dbv2.Update("items").Set( item{ FirstName: "Test First Name", LastName: "", // will omit zero field Address1: &address1, Address2: &emptyString, Address3: nil, // will omit nil pointer }, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address1"='114 Test Addr',"address2"='',"first_name"='Test First Name' [] } func ExampleUpdate_withOmitEmptyTag_valuer() { type item struct { FirstName dbsql.NullString `db:"first_name" ff:"omitempty"` MiddleName dbsql.NullString `db:"middle_name" ff:"omitempty"` LastName dbsql.NullString `db:"last_name" ff:"omitempty"` Address1 *dbsql.NullString `db:"address1" ff:"omitempty"` Address2 *dbsql.NullString `db:"address2" ff:"omitempty"` Address3 *dbsql.NullString `db:"address3" ff:"omitempty"` Address4 *dbsql.NullString `db:"address4" ff:"omitempty"` } query, args, _ := dbv2.Update("items").Set( item{ FirstName: dbsql.NullString{Valid: true, String: "Test First Name"}, MiddleName: dbsql.NullString{Valid: true, String: ""}, LastName: dbsql.NullString{}, // will omit zero valuer struct Address1: &dbsql.NullString{Valid: true, String: "Test Address 1"}, Address2: &dbsql.NullString{Valid: true, String: ""}, Address3: &dbsql.NullString{}, Address4: nil, // will omit nil pointer }, ).ToSQL() fmt.Println(query, args) // Output: // UPDATE "items" SET "address1"='Test Address 1',"address2"='',"address3"=NULL,"first_name"='Test First Name',"middle_name"='' [] } func ExampleUpdate_withDbv2Record() { sql, args, _ := dbv2.Update("items").Set( dbv2.Record{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdate_withMap() { sql, args, _ := dbv2.Update("items").Set( map[string]interface{}{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdate_withExpressions() { sql, args, _ := dbv2.Update("items").Set([]exp.UpdateExpression{ dbv2.C("name").Set("Test"), dbv2.C("address").Set("111 Test Addr"), }).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "name"='Test',"address"='111 Test Addr' [] } func ExampleUpdate_withSkipUpdateTag() { type item struct { Address string `db:"address"` Name string `db:"name" ff:"skipupdate"` } sql, args, _ := dbv2.Update("items").Set( item{Name: "Test", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr' [] } func ExampleUpdateDataset_Executor() { db := getDB() update := db.Update("test_user"). Where(dbv2.C("first_name").Eq("Bob")). Set(dbv2.Record{"first_name": "Bobby"}). Executor() if r, err := update.Exec(); err != nil { fmt.Println(err.Error()) } else { c, _ := r.RowsAffected() fmt.Printf("Updated %d users", c) } // Output: // Updated 1 users } func ExampleUpdateDataset_Executor_returning() { db := getDB() var ids []int64 update := db.Update("test_user"). Set(dbv2.Record{"last_name": "ucon"}). Where(dbv2.Ex{"last_name": "Yukon"}). Returning("id"). Executor() if err := update.ScanVals(&ids); err != nil { fmt.Println(err.Error()) } else { fmt.Printf("Updated users with ids %+v", ids) } // Output: // Updated users with ids [1 2 3] } func ExampleUpdateDataset_Returning() { sql, _, _ := dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Returning("id"). ToSQL() fmt.Println(sql) sql, _, _ = dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Returning(dbv2.T("test").All()). ToSQL() fmt.Println(sql) sql, _, _ = dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Returning("a", "b"). ToSQL() fmt.Println(sql) // Output: // UPDATE "test" SET "foo"='bar' RETURNING "id" // UPDATE "test" SET "foo"='bar' RETURNING "test".* // UPDATE "test" SET "foo"='bar' RETURNING "a", "b" } func ExampleUpdateDataset_With() { sql, _, _ := dbv2.Update("test"). With("some_vals(val)", dbv2.From().Select(dbv2.L("123"))). Where(dbv2.C("val").Eq(dbv2.From("some_vals").Select("val"))). Set(dbv2.Record{"name": "Test"}).ToSQL() fmt.Println(sql) // Output: // WITH some_vals(val) AS (SELECT 123) UPDATE "test" SET "name"='Test' WHERE ("val" IN (SELECT "val" FROM "some_vals")) } func ExampleUpdateDataset_WithRecursive() { sql, _, _ := dbv2.Update("nums"). WithRecursive("nums(x)", dbv2.From().Select(dbv2.L("1").As("num")). UnionAll(dbv2.From("nums"). Select(dbv2.L("x+1").As("num")).Where(dbv2.C("x").Lt(5)))). Set(dbv2.Record{"foo": dbv2.T("nums").Col("num")}). ToSQL() fmt.Println(sql) // Output: // WITH RECURSIVE nums(x) AS (SELECT 1 AS "num" UNION ALL (SELECT x+1 AS "num" FROM "nums" WHERE ("x" < 5))) UPDATE "nums" SET "foo"="nums"."num" } func ExampleUpdateDataset_Limit() { ds := dbv2.Dialect("mysql"). Update("test"). Set(dbv2.Record{"foo": "bar"}). Limit(10) sql, _, _ := ds.ToSQL() fmt.Println(sql) // Output: // UPDATE `test` SET `foo`='bar' LIMIT 10 } func ExampleUpdateDataset_LimitAll() { ds := dbv2.Dialect("mysql"). Update("test"). Set(dbv2.Record{"foo": "bar"}). LimitAll() sql, _, _ := ds.ToSQL() fmt.Println(sql) // Output: // UPDATE `test` SET `foo`='bar' LIMIT ALL } func ExampleUpdateDataset_ClearLimit() { ds := dbv2.Dialect("mysql"). Update("test"). Set(dbv2.Record{"foo": "bar"}). Limit(10) sql, _, _ := ds.ClearLimit().ToSQL() fmt.Println(sql) // Output: // UPDATE `test` SET `foo`='bar' } func ExampleUpdateDataset_Order() { ds := dbv2.Dialect("mysql"). Update("test"). Set(dbv2.Record{"foo": "bar"}). Order(dbv2.C("a").Asc()) sql, _, _ := ds.ToSQL() fmt.Println(sql) // Output: // UPDATE `test` SET `foo`='bar' ORDER BY `a` ASC } func ExampleUpdateDataset_OrderAppend() { ds := dbv2.Dialect("mysql"). Update("test"). Set(dbv2.Record{"foo": "bar"}). Order(dbv2.C("a").Asc()) sql, _, _ := ds.OrderAppend(dbv2.C("b").Desc().NullsLast()).ToSQL() fmt.Println(sql) // Output: // UPDATE `test` SET `foo`='bar' ORDER BY `a` ASC, `b` DESC NULLS LAST } func ExampleUpdateDataset_OrderPrepend() { ds := dbv2.Dialect("mysql"). Update("test"). Set(dbv2.Record{"foo": "bar"}). Order(dbv2.C("a").Asc()) sql, _, _ := ds.OrderPrepend(dbv2.C("b").Desc().NullsLast()).ToSQL() fmt.Println(sql) // Output: // UPDATE `test` SET `foo`='bar' ORDER BY `b` DESC NULLS LAST, `a` ASC } func ExampleUpdateDataset_ClearOrder() { ds := dbv2.Dialect("mysql"). Update("test"). Set(dbv2.Record{"foo": "bar"}). Order(dbv2.C("a").Asc()) sql, _, _ := ds.ClearOrder().ToSQL() fmt.Println(sql) // Output: // UPDATE `test` SET `foo`='bar' } func ExampleUpdateDataset_From() { ds := dbv2.Update("table_one"). Set(dbv2.Record{"foo": dbv2.I("table_two.bar")}). From("table_two"). Where(dbv2.Ex{"table_one.id": dbv2.I("table_two.id")}) sql, _, _ := ds.ToSQL() fmt.Println(sql) // Output: // UPDATE "table_one" SET "foo"="table_two"."bar" FROM "table_two" WHERE ("table_one"."id" = "table_two"."id") } func ExampleUpdateDataset_From_postgres() { dialect := dbv2.Dialect("postgres") ds := dialect.Update("table_one"). Set(dbv2.Record{"foo": dbv2.I("table_two.bar")}). From("table_two"). Where(dbv2.Ex{"table_one.id": dbv2.I("table_two.id")}) sql, _, _ := ds.ToSQL() fmt.Println(sql) // Output: // UPDATE "table_one" SET "foo"="table_two"."bar" FROM "table_two" WHERE ("table_one"."id" = "table_two"."id") } func ExampleUpdateDataset_From_mysql() { dialect := dbv2.Dialect("mysql") ds := dialect.Update("table_one"). Set(dbv2.Record{"foo": dbv2.I("table_two.bar")}). From("table_two"). Where(dbv2.Ex{"table_one.id": dbv2.I("table_two.id")}) sql, _, _ := ds.ToSQL() fmt.Println(sql) // Output: // UPDATE `table_one`,`table_two` SET `foo`=`table_two`.`bar` WHERE (`table_one`.`id` = `table_two`.`id`) } func ExampleUpdateDataset_Where() { // By default everything is anded together sql, _, _ := dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Where(dbv2.Ex{ "a": dbv2.Op{"gt": 10}, "b": dbv2.Op{"lt": 10}, "c": nil, "d": []string{"a", "b", "c"}, }).ToSQL() fmt.Println(sql) // You can use ExOr to get ORed expressions together sql, _, _ = dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Where(dbv2.ExOr{ "a": dbv2.Op{"gt": 10}, "b": dbv2.Op{"lt": 10}, "c": nil, "d": []string{"a", "b", "c"}, }).ToSQL() fmt.Println(sql) // You can use Or with Ex to Or multiple Ex maps together sql, _, _ = dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Where( dbv2.Or( dbv2.Ex{ "a": dbv2.Op{"gt": 10}, "b": dbv2.Op{"lt": 10}, }, dbv2.Ex{ "c": nil, "d": []string{"a", "b", "c"}, }, ), ).ToSQL() fmt.Println(sql) // By default everything is anded together sql, _, _ = dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Where( dbv2.C("a").Gt(10), dbv2.C("b").Lt(10), dbv2.C("c").IsNull(), dbv2.C("d").In("a", "b", "c"), ).ToSQL() fmt.Println(sql) // You can use a combination of Ors and Ands sql, _, _ = dbv2.Update("test"). Set(dbv2.Record{"foo": "bar"}). Where( dbv2.Or( dbv2.C("a").Gt(10), dbv2.And( dbv2.C("b").Lt(10), dbv2.C("c").IsNull(), ), ), ).ToSQL() fmt.Println(sql) // Output: // UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) // UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) OR ("b" < 10) OR ("c" IS NULL) OR ("d" IN ('a', 'b', 'c'))) // UPDATE "test" SET "foo"='bar' WHERE ((("a" > 10) AND ("b" < 10)) OR (("c" IS NULL) AND ("d" IN ('a', 'b', 'c')))) // UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) // UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) OR (("b" < 10) AND ("c" IS NULL))) } func ExampleUpdateDataset_Where_prepared() { // By default everything is anded together sql, args, _ := dbv2.Update("test"). Prepared(true). Set(dbv2.Record{"foo": "bar"}). Where(dbv2.Ex{ "a": dbv2.Op{"gt": 10}, "b": dbv2.Op{"lt": 10}, "c": nil, "d": []string{"a", "b", "c"}, }).ToSQL() fmt.Println(sql, args) // You can use ExOr to get ORed expressions together sql, args, _ = dbv2.Update("test").Prepared(true). Set(dbv2.Record{"foo": "bar"}). Where(dbv2.ExOr{ "a": dbv2.Op{"gt": 10}, "b": dbv2.Op{"lt": 10}, "c": nil, "d": []string{"a", "b", "c"}, }).ToSQL() fmt.Println(sql, args) // You can use Or with Ex to Or multiple Ex maps together sql, args, _ = dbv2.Update("test").Prepared(true). Set(dbv2.Record{"foo": "bar"}). Where( dbv2.Or( dbv2.Ex{ "a": dbv2.Op{"gt": 10}, "b": dbv2.Op{"lt": 10}, }, dbv2.Ex{ "c": nil, "d": []string{"a", "b", "c"}, }, ), ).ToSQL() fmt.Println(sql, args) // By default everything is anded together sql, args, _ = dbv2.Update("test").Prepared(true). Set(dbv2.Record{"foo": "bar"}). Where( dbv2.C("a").Gt(10), dbv2.C("b").Lt(10), dbv2.C("c").IsNull(), dbv2.C("d").In("a", "b", "c"), ).ToSQL() fmt.Println(sql, args) // You can use a combination of Ors and Ands sql, args, _ = dbv2.Update("test").Prepared(true). Set(dbv2.Record{"foo": "bar"}). Where( dbv2.Or( dbv2.C("a").Gt(10), dbv2.And( dbv2.C("b").Lt(10), dbv2.C("c").IsNull(), ), ), ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "test" SET "foo"=? WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [bar 10 10 a b c] // UPDATE "test" SET "foo"=? WHERE (("a" > ?) OR ("b" < ?) OR ("c" IS NULL) OR ("d" IN (?, ?, ?))) [bar 10 10 a b c] // UPDATE "test" SET "foo"=? WHERE ((("a" > ?) AND ("b" < ?)) OR (("c" IS NULL) AND ("d" IN (?, ?, ?)))) [bar 10 10 a b c] // UPDATE "test" SET "foo"=? WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [bar 10 10 a b c] // UPDATE "test" SET "foo"=? WHERE (("a" > ?) OR (("b" < ?) AND ("c" IS NULL))) [bar 10 10] } func ExampleUpdateDataset_ClearWhere() { ds := dbv2. Update("test"). Set(dbv2.Record{"foo": "bar"}). Where( dbv2.Or( dbv2.C("a").Gt(10), dbv2.And( dbv2.C("b").Lt(10), dbv2.C("c").IsNull(), ), ), ) sql, _, _ := ds.ClearWhere().ToSQL() fmt.Println(sql) // Output: // UPDATE "test" SET "foo"='bar' } func ExampleUpdateDataset_Table() { ds := dbv2.Update("test") sql, _, _ := ds.Table("test2").Set(dbv2.Record{"foo": "bar"}).ToSQL() fmt.Println(sql) // Output: // UPDATE "test2" SET "foo"='bar' } func ExampleUpdateDataset_Table_aliased() { ds := dbv2.Update("test") sql, _, _ := ds.Table(dbv2.T("test").As("t")).Set(dbv2.Record{"foo": "bar"}).ToSQL() fmt.Println(sql) // Output: // UPDATE "test" AS "t" SET "foo"='bar' } func ExampleUpdateDataset_Set() { type item struct { Address string `db:"address"` Name string `db:"name"` } sql, args, _ := dbv2.Update("items").Set( item{Name: "Test", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) sql, args, _ = dbv2.Update("items").Set( dbv2.Record{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) sql, args, _ = dbv2.Update("items").Set( map[string]interface{}{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdateDataset_Set_struct() { type item struct { Address string `db:"address"` Name string `db:"name"` } sql, args, _ := dbv2.Update("items").Set( item{Name: "Test", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdateDataset_Set_dbv2Record() { sql, args, _ := dbv2.Update("items").Set( dbv2.Record{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdateDataset_Set_map() { sql, args, _ := dbv2.Update("items").Set( map[string]interface{}{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdateDataset_Set_withSkipUpdateTag() { type item struct { Address string `db:"address"` Name string `db:"name" ff:"skipupdate"` } sql, args, _ := dbv2.Update("items").Set( item{Name: "Test", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr' [] } func ExampleUpdateDataset_Set_withDefaultIfEmptyTag() { type item struct { Address string `db:"address"` Name string `db:"name" ff:"defaultifempty"` } sql, args, _ := dbv2.Update("items").Set( item{Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) sql, args, _ = dbv2.Update("items").Set( item{Name: "Bob Yukon", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"=DEFAULT [] // UPDATE "items" SET "address"='111 Test Addr',"name"='Bob Yukon' [] } func ExampleUpdateDataset_Set_withNoTags() { type item struct { Address string Name string } sql, args, _ := dbv2.Update("items").Set( item{Name: "Test", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] } func ExampleUpdateDataset_Set_withEmbeddedStruct() { type Address struct { Street string `db:"address_street"` State string `db:"address_state"` } type User struct { Address FirstName string LastName string } ds := dbv2.Update("user").Set( User{Address: Address{Street: "111 Street", State: "NY"}, FirstName: "Greg", LastName: "Farley"}, ) updateSQL, args, _ := ds.ToSQL() fmt.Println(updateSQL, args) // Output: // UPDATE "user" SET "address_state"='NY',"address_street"='111 Street',"firstname"='Greg',"lastname"='Farley' [] } func ExampleUpdateDataset_Set_withIgnoredEmbedded() { type Address struct { Street string State string } type User struct { Address `db:"-"` FirstName string LastName string } ds := dbv2.Update("user").Set( User{Address: Address{Street: "111 Street", State: "NY"}, FirstName: "Greg", LastName: "Farley"}, ) updateSQL, args, _ := ds.ToSQL() fmt.Println(updateSQL, args) // Output: // UPDATE "user" SET "firstname"='Greg',"lastname"='Farley' [] } func ExampleUpdateDataset_Set_withNilEmbeddedPointer() { type Address struct { Street string State string } type User struct { *Address FirstName string LastName string } ds := dbv2.Update("user").Set( User{FirstName: "Greg", LastName: "Farley"}, ) updateSQL, args, _ := ds.ToSQL() fmt.Println(updateSQL, args) // Output: // UPDATE "user" SET "firstname"='Greg',"lastname"='Farley' [] } func ExampleUpdateDataset_ToSQL_prepared() { type item struct { Address string `db:"address"` Name string `db:"name"` } sql, args, _ := dbv2.From("items").Prepared(true).Update().Set( item{Name: "Test", Address: "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) sql, args, _ = dbv2.From("items").Prepared(true).Update().Set( dbv2.Record{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) sql, args, _ = dbv2.From("items").Prepared(true).Update().Set( map[string]interface{}{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test] // UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test] // UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test] } func ExampleUpdateDataset_Prepared() { sql, args, _ := dbv2.Update("items").Prepared(true).Set( dbv2.Record{"name": "Test", "address": "111 Test Addr"}, ).ToSQL() fmt.Println(sql, args) // Output: // UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test] }