Files
db/select_dataset_example_test.go
T
2025-03-22 23:02:05 +08:00

1686 lines
48 KiB
Go

//nolint:lll // sql statements are long
package db_test
import (
goSQL "database/sql"
"fmt"
"os"
"regexp"
"time"
dbv2 "git.fsdpf.net/go/db/v2"
"git.fsdpf.net/go/db/v2/exp"
"github.com/lib/pq"
)
const schema = `
DROP TABLE IF EXISTS "user_role";
DROP TABLE IF EXISTS "test_user";
CREATE TABLE "test_user" (
"id" SERIAL PRIMARY KEY NOT NULL,
"first_name" VARCHAR(45) NOT NULL,
"last_name" VARCHAR(45) NOT NULL,
"created" TIMESTAMP NOT NULL DEFAULT now()
);
CREATE TABLE "user_role" (
"id" SERIAL PRIMARY KEY NOT NULL,
"user_id" BIGINT NOT NULL REFERENCES test_user(id) ON DELETE CASCADE,
"name" VARCHAR(45) NOT NULL,
"created" TIMESTAMP NOT NULL DEFAULT now()
);
`
const defaultDBURI = "postgres://postgres:@localhost:5435/dbv2postgres?sslmode=disable"
var dbv2DB *dbv2.Database
func getDB() *dbv2.Database {
if dbv2DB == nil {
dbURI := os.Getenv("PG_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
uri, err := pq.ParseURL(dbURI)
if err != nil {
panic(err)
}
pdb, err := goSQL.Open("postgres", uri)
if err != nil {
panic(err)
}
dbv2DB = dbv2.New("postgres", pdb)
}
// reset the db
if _, err := dbv2DB.Exec(schema); err != nil {
panic(err)
}
type dbv2User struct {
ID int64 `db:"id" ff:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" ff:"skipupdate"`
}
users := []dbv2User{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
var userIds []int64
err := dbv2DB.Insert("test_user").Rows(users).Returning("id").Executor().ScanVals(&userIds)
if err != nil {
panic(err)
}
type userRole struct {
ID int64 `db:"id" ff:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" ff:"skipupdate"`
}
roles := []userRole{
{UserID: userIds[0], Name: "Admin"},
{UserID: userIds[1], Name: "Manager"},
{UserID: userIds[2], Name: "Manager"},
{UserID: userIds[3], Name: "User"},
}
_, err = dbv2DB.Insert("user_role").Rows(roles).Executor().Exec()
if err != nil {
panic(err)
}
return dbv2DB
}
func ExampleSelectDataset() {
ds := dbv2.From("test").
Select(dbv2.COUNT("*")).
InnerJoin(dbv2.T("test2"), dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.id")))).
LeftJoin(dbv2.T("test3"), dbv2.On(dbv2.I("test2.fkey").Eq(dbv2.I("test3.id")))).
Where(
dbv2.Ex{
"test.name": dbv2.Op{
"like": regexp.MustCompile("^[ab]"),
},
"test2.amount": dbv2.Op{
"isNot": nil,
},
},
dbv2.ExOr{
"test3.id": nil,
"test3.status": []string{"passed", "active", "registered"},
}).
Order(dbv2.I("test.created").Desc().NullsLast()).
GroupBy(dbv2.I("test.user_id")).
Having(dbv2.AVG("test3.age").Gt(10))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
//nolint:lll // SQL statements are long
// Output:
// SELECT COUNT(*) FROM "test" INNER JOIN "test2" ON ("test"."fkey" = "test2"."id") LEFT JOIN "test3" ON ("test2"."fkey" = "test3"."id") WHERE ((("test"."name" ~ '^[ab]') AND ("test2"."amount" IS NOT NULL)) AND (("test3"."id" IS NULL) OR ("test3"."status" IN ('passed', 'active', 'registered')))) GROUP BY "test"."user_id" HAVING (AVG("test3"."age") > 10) ORDER BY "test"."created" DESC NULLS LAST []
// SELECT COUNT(*) FROM "test" INNER JOIN "test2" ON ("test"."fkey" = "test2"."id") LEFT JOIN "test3" ON ("test2"."fkey" = "test3"."id") WHERE ((("test"."name" ~ ?) AND ("test2"."amount" IS NOT NULL)) AND (("test3"."id" IS NULL) OR ("test3"."status" IN (?, ?, ?)))) GROUP BY "test"."user_id" HAVING (AVG("test3"."age") > ?) ORDER BY "test"."created" DESC NULLS LAST [^[ab] passed active registered 10]
}
func ExampleSelect() {
sql, _, _ := dbv2.Select(dbv2.L("NOW()")).ToSQL()
fmt.Println(sql)
// Output:
// SELECT NOW()
}
func ExampleFrom() {
sql, args, _ := dbv2.From("test").ToSQL()
fmt.Println(sql, args)
// Output:
// SELECT * FROM "test" []
}
func ExampleSelectDataset_As() {
ds := dbv2.From("test").As("t")
sql, _, _ := dbv2.From(ds).ToSQL()
fmt.Println(sql)
// Output: SELECT * FROM (SELECT * FROM "test") AS "t"
}
func ExampleSelectDataset_Union() {
sql, _, _ := dbv2.From("test").
Union(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
Union(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
Union(dbv2.From("test2").
Order(dbv2.C("id").Desc())).
ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" UNION (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
}
func ExampleSelectDataset_UnionAll() {
sql, _, _ := dbv2.From("test").
UnionAll(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
UnionAll(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
UnionAll(dbv2.From("test2").
Order(dbv2.C("id").Desc())).
ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" UNION ALL (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION ALL (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION ALL (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
}
func ExampleSelectDataset_With() {
sql, _, _ := dbv2.From("one").
With("one", dbv2.From().Select(dbv2.L("1"))).
Select(dbv2.Star()).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("derived").
With("intermed", dbv2.From("test").Select(dbv2.Star()).Where(dbv2.C("x").Gte(5))).
With("derived", dbv2.From("intermed").Select(dbv2.Star()).Where(dbv2.C("x").Lt(10))).
Select(dbv2.Star()).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("multi").
With("multi(x,y)", dbv2.From().Select(dbv2.L("1"), dbv2.L("2"))).
Select(dbv2.C("x"), dbv2.C("y")).
ToSQL()
fmt.Println(sql)
// Output:
// WITH one AS (SELECT 1) SELECT * FROM "one"
// WITH intermed AS (SELECT * FROM "test" WHERE ("x" >= 5)), derived AS (SELECT * FROM "intermed" WHERE ("x" < 10)) SELECT * FROM "derived"
// WITH multi(x,y) AS (SELECT 1, 2) SELECT "x", "y" FROM "multi"
}
func ExampleSelectDataset_With_insertDataset() {
insertDs := dbv2.Insert("foo").Rows(dbv2.Record{"user_id": 10}).Returning("id")
ds := dbv2.From("bar").
With("ins", insertDs).
Select("bar_name").
Where(dbv2.Ex{"bar.user_id": dbv2.I("ins.user_id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
sql, args, _ := ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
// Output:
// WITH ins AS (INSERT INTO "foo" ("user_id") VALUES (10) RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "ins"."user_id")
// WITH ins AS (INSERT INTO "foo" ("user_id") VALUES (?) RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "ins"."user_id") [10]
}
func ExampleSelectDataset_With_updateDataset() {
updateDs := dbv2.Update("foo").Set(dbv2.Record{"bar": "baz"}).Returning("id")
ds := dbv2.From("bar").
With("upd", updateDs).
Select("bar_name").
Where(dbv2.Ex{"bar.user_id": dbv2.I("upd.user_id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
sql, args, _ := ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
// Output:
// WITH upd AS (UPDATE "foo" SET "bar"='baz' RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "upd"."user_id")
// WITH upd AS (UPDATE "foo" SET "bar"=? RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "upd"."user_id") [baz]
}
func ExampleSelectDataset_With_deleteDataset() {
deleteDs := dbv2.Delete("foo").Where(dbv2.Ex{"bar": "baz"}).Returning("id")
ds := dbv2.From("bar").
With("del", deleteDs).
Select("bar_name").
Where(dbv2.Ex{"bar.user_id": dbv2.I("del.user_id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
sql, args, _ := ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
// Output:
// WITH del AS (DELETE FROM "foo" WHERE ("bar" = 'baz') RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "del"."user_id")
// WITH del AS (DELETE FROM "foo" WHERE ("bar" = ?) RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "del"."user_id") [baz]
}
func ExampleSelectDataset_WithRecursive() {
sql, _, _ := dbv2.From("nums").
WithRecursive("nums(x)",
dbv2.From().Select(dbv2.L("1")).
UnionAll(dbv2.From("nums").
Select(dbv2.L("x+1")).Where(dbv2.C("x").Lt(5)))).
ToSQL()
fmt.Println(sql)
// Output:
// WITH RECURSIVE nums(x) AS (SELECT 1 UNION ALL (SELECT x+1 FROM "nums" WHERE ("x" < 5))) SELECT * FROM "nums"
}
func ExampleSelectDataset_Intersect() {
sql, _, _ := dbv2.From("test").
Intersect(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
Intersect(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
Intersect(dbv2.From("test2").
Order(dbv2.C("id").Desc())).
ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" INTERSECT (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
}
func ExampleSelectDataset_IntersectAll() {
sql, _, _ := dbv2.From("test").
IntersectAll(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
IntersectAll(dbv2.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").
Limit(1).
IntersectAll(dbv2.From("test2").
Order(dbv2.C("id").Desc())).
ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" INTERSECT ALL (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT ALL (SELECT * FROM "test2")
// SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT ALL (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
}
func ExampleSelectDataset_ClearOffset() {
ds := dbv2.From("test").
Offset(2)
sql, _, _ := ds.
ClearOffset().
ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test"
}
func ExampleSelectDataset_Offset() {
ds := dbv2.From("test").Offset(2)
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" OFFSET 2
}
func ExampleSelectDataset_Limit() {
ds := dbv2.From("test").Limit(10)
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" LIMIT 10
}
func ExampleSelectDataset_LimitAll() {
ds := dbv2.From("test").LimitAll()
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" LIMIT ALL
}
func ExampleSelectDataset_ClearLimit() {
ds := dbv2.From("test").Limit(10)
sql, _, _ := ds.ClearLimit().ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test"
}
func ExampleSelectDataset_Order() {
ds := dbv2.From("test").Order(dbv2.C("a").Asc())
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" ORDER BY "a" ASC
}
func ExampleSelectDataset_Order_caseExpression() {
ds := dbv2.From("test").Order(dbv2.Case().When(dbv2.C("num").Gt(10), 0).Else(1).Asc())
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" ORDER BY CASE WHEN ("num" > 10) THEN 0 ELSE 1 END ASC
}
func ExampleSelectDataset_OrderAppend() {
ds := dbv2.From("test").Order(dbv2.C("a").Asc())
sql, _, _ := ds.OrderAppend(dbv2.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" ORDER BY "a" ASC, "b" DESC NULLS LAST
}
func ExampleSelectDataset_OrderPrepend() {
ds := dbv2.From("test").Order(dbv2.C("a").Asc())
sql, _, _ := ds.OrderPrepend(dbv2.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" ORDER BY "b" DESC NULLS LAST, "a" ASC
}
func ExampleSelectDataset_ClearOrder() {
ds := dbv2.From("test").Order(dbv2.C("a").Asc())
sql, _, _ := ds.ClearOrder().ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test"
}
func ExampleSelectDataset_GroupBy() {
sql, _, _ := dbv2.From("test").
Select(dbv2.SUM("income").As("income_sum")).
GroupBy("age").
ToSQL()
fmt.Println(sql)
// Output:
// SELECT SUM("income") AS "income_sum" FROM "test" GROUP BY "age"
}
func ExampleSelectDataset_GroupByAppend() {
ds := dbv2.From("test").
Select(dbv2.SUM("income").As("income_sum")).
GroupBy("age")
sql, _, _ := ds.
GroupByAppend("job").
ToSQL()
fmt.Println(sql)
// the original dataset group by does not change
sql, _, _ = ds.ToSQL()
fmt.Println(sql)
// Output:
// SELECT SUM("income") AS "income_sum" FROM "test" GROUP BY "age", "job"
// SELECT SUM("income") AS "income_sum" FROM "test" GROUP BY "age"
}
func ExampleSelectDataset_Having() {
sql, _, _ := dbv2.From("test").Having(dbv2.SUM("income").Gt(1000)).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").GroupBy("age").Having(dbv2.SUM("income").Gt(1000)).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" HAVING (SUM("income") > 1000)
// SELECT * FROM "test" GROUP BY "age" HAVING (SUM("income") > 1000)
}
func ExampleSelectDataset_Window() {
ds := dbv2.From("test").
Select(dbv2.ROW_NUMBER().Over(dbv2.W().PartitionBy("a").OrderBy(dbv2.I("b").Asc())))
query, args, _ := ds.ToSQL()
fmt.Println(query, args)
ds = dbv2.From("test").
Select(dbv2.ROW_NUMBER().OverName(dbv2.I("w"))).
Window(dbv2.W("w").PartitionBy("a").OrderBy(dbv2.I("b").Asc()))
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
ds = dbv2.From("test").
Select(dbv2.ROW_NUMBER().OverName(dbv2.I("w1"))).
Window(
dbv2.W("w1").PartitionBy("a"),
dbv2.W("w").Inherit("w1").OrderBy(dbv2.I("b").Asc()),
)
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
ds = dbv2.From("test").
Select(dbv2.ROW_NUMBER().Over(dbv2.W().Inherit("w").OrderBy("b"))).
Window(dbv2.W("w").PartitionBy("a"))
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
// Output
// SELECT ROW_NUMBER() OVER (PARTITION BY "a" ORDER BY "b" ASC) FROM "test" []
// SELECT ROW_NUMBER() OVER "w" FROM "test" WINDOW "w" AS (PARTITION BY "a" ORDER BY "b" ASC) []
// SELECT ROW_NUMBER() OVER "w" FROM "test" WINDOW "w1" AS (PARTITION BY "a"), "w" AS ("w1" ORDER BY "b" ASC) []
// SELECT ROW_NUMBER() OVER ("w" ORDER BY "b") FROM "test" WINDOW "w" AS (PARTITION BY "a") []
}
func ExampleSelectDataset_Where() {
// By default everything is anded together
sql, _, _ := dbv2.From("test").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.From("test").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.From("test").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.From("test").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.From("test").Where(
dbv2.Or(
dbv2.C("a").Gt(10),
dbv2.And(
dbv2.C("b").Lt(10),
dbv2.C("c").IsNull(),
),
),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c')))
// SELECT * FROM "test" WHERE (("a" > 10) OR ("b" < 10) OR ("c" IS NULL) OR ("d" IN ('a', 'b', 'c')))
// SELECT * FROM "test" WHERE ((("a" > 10) AND ("b" < 10)) OR (("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))))
// SELECT * FROM "test" WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c')))
// SELECT * FROM "test" WHERE (("a" > 10) OR (("b" < 10) AND ("c" IS NULL)))
}
func ExampleSelectDataset_Where_prepared() {
// By default everything is anded together
sql, args, _ := dbv2.From("test").Prepared(true).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.From("test").Prepared(true).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.From("test").Prepared(true).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.From("test").Prepared(true).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.From("test").Prepared(true).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:
// SELECT * FROM "test" WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [10 10 a b c]
// SELECT * FROM "test" WHERE (("a" > ?) OR ("b" < ?) OR ("c" IS NULL) OR ("d" IN (?, ?, ?))) [10 10 a b c]
// SELECT * FROM "test" WHERE ((("a" > ?) AND ("b" < ?)) OR (("c" IS NULL) AND ("d" IN (?, ?, ?)))) [10 10 a b c]
// SELECT * FROM "test" WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [10 10 a b c]
// SELECT * FROM "test" WHERE (("a" > ?) OR (("b" < ?) AND ("c" IS NULL))) [10 10]
}
func ExampleSelectDataset_ClearWhere() {
ds := dbv2.From("test").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:
// SELECT * FROM "test"
}
func ExampleSelectDataset_Join() {
sql, _, _ := dbv2.From("test").Join(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{"test.fkey": dbv2.I("test2.Id")}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").Join(dbv2.T("test2"), dbv2.Using("common_column")).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").Join(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.T("test2").Col("Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").Join(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.T("test").Col("fkey").Eq(dbv2.T("t").Col("Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" INNER JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" INNER JOIN "test2" USING ("common_column")
// SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_InnerJoin() {
sql, _, _ := dbv2.From("test").InnerJoin(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{
"test.fkey": dbv2.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").InnerJoin(
dbv2.T("test2"),
dbv2.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").InnerJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").InnerJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" INNER JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" INNER JOIN "test2" USING ("common_column")
// SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_FullOuterJoin() {
sql, _, _ := dbv2.From("test").FullOuterJoin(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{
"test.fkey": dbv2.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").FullOuterJoin(
dbv2.T("test2"),
dbv2.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").FullOuterJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").FullOuterJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" FULL OUTER JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" FULL OUTER JOIN "test2" USING ("common_column")
// SELECT * FROM "test" FULL OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" FULL OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_RightOuterJoin() {
sql, _, _ := dbv2.From("test").RightOuterJoin(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{
"test.fkey": dbv2.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").RightOuterJoin(
dbv2.T("test2"),
dbv2.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").RightOuterJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").RightOuterJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" RIGHT OUTER JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" RIGHT OUTER JOIN "test2" USING ("common_column")
// SELECT * FROM "test" RIGHT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" RIGHT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_LeftOuterJoin() {
sql, _, _ := dbv2.From("test").LeftOuterJoin(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{
"test.fkey": dbv2.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").LeftOuterJoin(
dbv2.T("test2"),
dbv2.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").LeftOuterJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").LeftOuterJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" LEFT OUTER JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" LEFT OUTER JOIN "test2" USING ("common_column")
// SELECT * FROM "test" LEFT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" LEFT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_FullJoin() {
sql, _, _ := dbv2.From("test").FullJoin(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{
"test.fkey": dbv2.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").FullJoin(
dbv2.T("test2"),
dbv2.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").FullJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").FullJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" FULL JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" FULL JOIN "test2" USING ("common_column")
// SELECT * FROM "test" FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_RightJoin() {
sql, _, _ := dbv2.From("test").RightJoin(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{
"test.fkey": dbv2.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").RightJoin(
dbv2.T("test2"),
dbv2.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").RightJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").RightJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" RIGHT JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" RIGHT JOIN "test2" USING ("common_column")
// SELECT * FROM "test" RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_LeftJoin() {
sql, _, _ := dbv2.From("test").LeftJoin(
dbv2.T("test2"),
dbv2.On(dbv2.Ex{
"test.fkey": dbv2.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").LeftJoin(
dbv2.T("test2"),
dbv2.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").LeftJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").LeftJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
dbv2.On(dbv2.I("test.fkey").Eq(dbv2.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" LEFT JOIN "test2" ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" LEFT JOIN "test2" USING ("common_column")
// SELECT * FROM "test" LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id")
// SELECT * FROM "test" LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
}
func ExampleSelectDataset_NaturalJoin() {
sql, _, _ := dbv2.From("test").NaturalJoin(dbv2.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" NATURAL JOIN "test2"
// SELECT * FROM "test" NATURAL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0))
// SELECT * FROM "test" NATURAL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
}
func ExampleSelectDataset_NaturalLeftJoin() {
sql, _, _ := dbv2.From("test").NaturalLeftJoin(dbv2.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalLeftJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalLeftJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" NATURAL LEFT JOIN "test2"
// SELECT * FROM "test" NATURAL LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0))
// SELECT * FROM "test" NATURAL LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
}
func ExampleSelectDataset_NaturalRightJoin() {
sql, _, _ := dbv2.From("test").NaturalRightJoin(dbv2.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalRightJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalRightJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" NATURAL RIGHT JOIN "test2"
// SELECT * FROM "test" NATURAL RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0))
// SELECT * FROM "test" NATURAL RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
}
func ExampleSelectDataset_NaturalFullJoin() {
sql, _, _ := dbv2.From("test").NaturalFullJoin(dbv2.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalFullJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").NaturalFullJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" NATURAL FULL JOIN "test2"
// SELECT * FROM "test" NATURAL FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0))
// SELECT * FROM "test" NATURAL FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
}
func ExampleSelectDataset_CrossJoin() {
sql, _, _ := dbv2.From("test").CrossJoin(dbv2.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").CrossJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").CrossJoin(
dbv2.From("test2").Where(dbv2.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test" CROSS JOIN "test2"
// SELECT * FROM "test" CROSS JOIN (SELECT * FROM "test2" WHERE ("amount" > 0))
// SELECT * FROM "test" CROSS JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
}
func ExampleSelectDataset_FromSelf() {
sql, _, _ := dbv2.From("test").FromSelf().ToSQL()
fmt.Println(sql)
sql, _, _ = dbv2.From("test").As("my_test_table").FromSelf().ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM (SELECT * FROM "test") AS "t1"
// SELECT * FROM (SELECT * FROM "test") AS "my_test_table"
}
func ExampleSelectDataset_From() {
ds := dbv2.From("test")
sql, _, _ := ds.From("test2").ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test2"
}
func ExampleSelectDataset_From_withDataset() {
ds := dbv2.From("test")
fromDs := ds.Where(dbv2.C("age").Gt(10))
sql, _, _ := ds.From(fromDs).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM (SELECT * FROM "test" WHERE ("age" > 10)) AS "t1"
}
func ExampleSelectDataset_From_withAliasedDataset() {
ds := dbv2.From("test")
fromDs := ds.Where(dbv2.C("age").Gt(10))
sql, _, _ := ds.From(fromDs.As("test2")).ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM (SELECT * FROM "test" WHERE ("age" > 10)) AS "test2"
}
func ExampleSelectDataset_Select() {
sql, _, _ := dbv2.From("test").Select("a", "b", "c").ToSQL()
fmt.Println(sql)
// Output:
// SELECT "a", "b", "c" FROM "test"
}
func ExampleSelectDataset_Select_withDataset() {
ds := dbv2.From("test")
fromDs := ds.Select("age").Where(dbv2.C("age").Gt(10))
sql, _, _ := ds.From().Select(fromDs).ToSQL()
fmt.Println(sql)
// Output:
// SELECT (SELECT "age" FROM "test" WHERE ("age" > 10))
}
func ExampleSelectDataset_Select_withAliasedDataset() {
ds := dbv2.From("test")
fromDs := ds.Select("age").Where(dbv2.C("age").Gt(10))
sql, _, _ := ds.From().Select(fromDs.As("ages")).ToSQL()
fmt.Println(sql)
// Output:
// SELECT (SELECT "age" FROM "test" WHERE ("age" > 10)) AS "ages"
}
func ExampleSelectDataset_Select_withLiteral() {
sql, _, _ := dbv2.From("test").Select(dbv2.L("a + b").As("sum")).ToSQL()
fmt.Println(sql)
// Output:
// SELECT a + b AS "sum" FROM "test"
}
func ExampleSelectDataset_Select_withSQLFunctionExpression() {
sql, _, _ := dbv2.From("test").Select(
dbv2.COUNT("*").As("age_count"),
dbv2.MAX("age").As("max_age"),
dbv2.AVG("age").As("avg_age"),
).ToSQL()
fmt.Println(sql)
// Output:
// SELECT COUNT(*) AS "age_count", MAX("age") AS "max_age", AVG("age") AS "avg_age" FROM "test"
}
func ExampleSelectDataset_Select_withStruct() {
ds := dbv2.From("test")
type myStruct struct {
Name string
Address string `db:"address"`
EmailAddress string `db:"email_address"`
}
// Pass with pointer
sql, _, _ := ds.Select(&myStruct{}).ToSQL()
fmt.Println(sql)
// Pass instance of
sql, _, _ = ds.Select(myStruct{}).ToSQL()
fmt.Println(sql)
type myStruct2 struct {
myStruct
Zipcode string `db:"zipcode"`
}
// Pass pointer to struct with embedded struct
sql, _, _ = ds.Select(&myStruct2{}).ToSQL()
fmt.Println(sql)
// Pass instance of struct with embedded struct
sql, _, _ = ds.Select(myStruct2{}).ToSQL()
fmt.Println(sql)
var myStructs []myStruct
// Pass slice of structs, will only select columns from underlying type
sql, _, _ = ds.Select(myStructs).ToSQL()
fmt.Println(sql)
// Output:
// SELECT "address", "email_address", "name" FROM "test"
// SELECT "address", "email_address", "name" FROM "test"
// SELECT "address", "email_address", "name", "zipcode" FROM "test"
// SELECT "address", "email_address", "name", "zipcode" FROM "test"
// SELECT "address", "email_address", "name" FROM "test"
}
func ExampleSelectDataset_Distinct() {
sql, _, _ := dbv2.From("test").Select("a", "b").Distinct().ToSQL()
fmt.Println(sql)
// Output:
// SELECT DISTINCT "a", "b" FROM "test"
}
func ExampleSelectDataset_Distinct_on() {
sql, _, _ := dbv2.From("test").Distinct("a").ToSQL()
fmt.Println(sql)
// Output:
// SELECT DISTINCT ON ("a") * FROM "test"
}
func ExampleSelectDataset_Distinct_onWithLiteral() {
sql, _, _ := dbv2.From("test").Distinct(dbv2.L("COALESCE(?, ?)", dbv2.C("a"), "empty")).ToSQL()
fmt.Println(sql)
// Output:
// SELECT DISTINCT ON (COALESCE("a", 'empty')) * FROM "test"
}
func ExampleSelectDataset_Distinct_onCoalesce() {
sql, _, _ := dbv2.From("test").Distinct(dbv2.COALESCE(dbv2.C("a"), "empty")).ToSQL()
fmt.Println(sql)
// Output:
// SELECT DISTINCT ON (COALESCE("a", 'empty')) * FROM "test"
}
func ExampleSelectDataset_SelectAppend() {
ds := dbv2.From("test").Select("a", "b")
sql, _, _ := ds.SelectAppend("c").ToSQL()
fmt.Println(sql)
ds = dbv2.From("test").Select("a", "b").Distinct()
sql, _, _ = ds.SelectAppend("c").ToSQL()
fmt.Println(sql)
// Output:
// SELECT "a", "b", "c" FROM "test"
// SELECT DISTINCT "a", "b", "c" FROM "test"
}
func ExampleSelectDataset_ClearSelect() {
ds := dbv2.From("test").Select("a", "b")
sql, _, _ := ds.ClearSelect().ToSQL()
fmt.Println(sql)
ds = dbv2.From("test").Select("a", "b").Distinct()
sql, _, _ = ds.ClearSelect().ToSQL()
fmt.Println(sql)
// Output:
// SELECT * FROM "test"
// SELECT * FROM "test"
}
func ExampleSelectDataset_ToSQL() {
sql, args, _ := dbv2.From("items").Where(dbv2.Ex{"a": 1}).ToSQL()
fmt.Println(sql, args)
// Output:
// SELECT * FROM "items" WHERE ("a" = 1) []
}
func ExampleSelectDataset_ToSQL_prepared() {
sql, args, _ := dbv2.From("items").Where(dbv2.Ex{"a": 1}).Prepared(true).ToSQL()
fmt.Println(sql, args)
// Output:
// SELECT * FROM "items" WHERE ("a" = ?) [1]
}
func ExampleSelectDataset_Update() {
type item struct {
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := dbv2.From("items").Update().Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = dbv2.From("items").Update().Set(
dbv2.Record{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = dbv2.From("items").Update().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 ExampleSelectDataset_Insert() {
type item struct {
ID uint32 `db:"id" ff:"skipinsert"`
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := dbv2.From("items").Insert().Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = dbv2.From("items").Insert().Rows(
dbv2.Record{"name": "Test1", "address": "111 Test Addr"},
dbv2.Record{"name": "Test2", "address": "112 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = dbv2.From("items").Insert().Rows(
[]item{
{Name: "Test1", Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).ToSQL()
fmt.Println(sql, args)
sql, args, _ = dbv2.From("items").Insert().Rows(
[]dbv2.Record{
{"name": "Test1", "address": "111 Test Addr"},
{"name": "Test2", "address": "112 Test Addr"},
}).ToSQL()
fmt.Println(sql, args)
// Output:
// INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
// INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
// INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
// INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
}
func ExampleSelectDataset_Delete() {
sql, args, _ := dbv2.From("items").Delete().ToSQL()
fmt.Println(sql, args)
sql, args, _ = dbv2.From("items").
Where(dbv2.Ex{"id": dbv2.Op{"gt": 10}}).
Delete().
ToSQL()
fmt.Println(sql, args)
// Output:
// DELETE FROM "items" []
// DELETE FROM "items" WHERE ("id" > 10) []
}
func ExampleSelectDataset_Truncate() {
sql, args, _ := dbv2.From("items").Truncate().ToSQL()
fmt.Println(sql, args)
// Output:
// TRUNCATE "items" []
}
func ExampleSelectDataset_Prepared() {
sql, args, _ := dbv2.From("items").Prepared(true).Where(dbv2.Ex{
"col1": "a",
"col2": 1,
"col3": true,
"col4": false,
"col5": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
//nolint:lll // sql statements are long
// Output:
// SELECT * FROM "items" WHERE (("col1" = ?) AND ("col2" = ?) AND ("col3" IS TRUE) AND ("col4" IS FALSE) AND ("col5" IN (?, ?, ?))) [a 1 a b c]
}
func ExampleSelectDataset_ScanStructs() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
db := getDB()
var users []User
if err := db.From("test_user").ScanStructs(&users); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("\n%+v", users)
users = users[0:0]
if err := db.From("test_user").Select("first_name").ScanStructs(&users); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("\n%+v", users)
// Output:
// [{FirstName:Bob LastName:Yukon} {FirstName:Sally LastName:Yukon} {FirstName:Vinita LastName:Yukon} {FirstName:John LastName:Doe}]
// [{FirstName:Bob LastName:} {FirstName:Sally LastName:} {FirstName:Vinita LastName:} {FirstName:John LastName:}]
}
func ExampleSelectDataset_ScanStructs_prepared() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
db := getDB()
ds := db.From("test_user").
Prepared(true).
Where(dbv2.Ex{
"last_name": "Yukon",
})
var users []User
if err := ds.ScanStructs(&users); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("\n%+v", users)
// Output:
// [{FirstName:Bob LastName:Yukon} {FirstName:Sally LastName:Yukon} {FirstName:Vinita LastName:Yukon}]
}
// In this example we create a new struct that has two structs that represent two table
// the User and Role fields are tagged with the table name
func ExampleSelectDataset_ScanStructs_withJoinAutoSelect() {
type Role struct {
UserID uint64 `db:"user_id"`
Name string `db:"name"`
}
type User struct {
ID uint64 `db:"id"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
type UserAndRole struct {
User User `db:"test_user"` // tag as the "test_user" table
Role Role `db:"user_role"` // tag as "user_role" table
}
db := getDB()
ds := db.
From("test_user").
Join(dbv2.T("user_role"), dbv2.On(dbv2.I("test_user.id").Eq(dbv2.I("user_role.user_id"))))
var users []UserAndRole
// Scan structs will auto build the
if err := ds.ScanStructs(&users); err != nil {
fmt.Println(err.Error())
return
}
for _, u := range users {
fmt.Printf("\n%+v", u)
}
// Output:
// {User:{ID:1 FirstName:Bob LastName:Yukon} Role:{UserID:1 Name:Admin}}
// {User:{ID:2 FirstName:Sally LastName:Yukon} Role:{UserID:2 Name:Manager}}
// {User:{ID:3 FirstName:Vinita LastName:Yukon} Role:{UserID:3 Name:Manager}}
// {User:{ID:4 FirstName:John LastName:Doe} Role:{UserID:4 Name:User}}
}
// In this example we create a new struct that has the user properties as well as a nested
// Role struct from the join table
func ExampleSelectDataset_ScanStructs_withJoinManualSelect() {
type Role struct {
UserID uint64 `db:"user_id"`
Name string `db:"name"`
}
type User struct {
ID uint64 `db:"id"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Role Role `db:"user_role"` // tag as "user_role" table
}
db := getDB()
ds := db.
Select(
"test_user.id",
"test_user.first_name",
"test_user.last_name",
// alias the fully qualified identifier `C` is important here so it doesnt parse it
dbv2.I("user_role.user_id").As(dbv2.C("user_role.user_id")),
dbv2.I("user_role.name").As(dbv2.C("user_role.name")),
).
From("test_user").
Join(dbv2.T("user_role"), dbv2.On(dbv2.I("test_user.id").Eq(dbv2.I("user_role.user_id"))))
var users []User
if err := ds.ScanStructs(&users); err != nil {
fmt.Println(err.Error())
return
}
for _, u := range users {
fmt.Printf("\n%+v", u)
}
// Output:
// {ID:1 FirstName:Bob LastName:Yukon Role:{UserID:1 Name:Admin}}
// {ID:2 FirstName:Sally LastName:Yukon Role:{UserID:2 Name:Manager}}
// {ID:3 FirstName:Vinita LastName:Yukon Role:{UserID:3 Name:Manager}}
// {ID:4 FirstName:John LastName:Doe Role:{UserID:4 Name:User}}
}
func ExampleSelectDataset_ScanStruct() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
db := getDB()
findUserByName := func(name string) {
var user User
ds := db.From("test_user").Where(dbv2.C("first_name").Eq(name))
found, err := ds.ScanStruct(&user)
switch {
case err != nil:
fmt.Println(err.Error())
case !found:
fmt.Printf("No user found for first_name %s\n", name)
default:
fmt.Printf("Found user: %+v\n", user)
}
}
findUserByName("Bob")
findUserByName("Zeb")
// Output:
// Found user: {FirstName:Bob LastName:Yukon}
// No user found for first_name Zeb
}
// In this example we create a new struct that has two structs that represent two table
// the User and Role fields are tagged with the table name
func ExampleSelectDataset_ScanStruct_withJoinAutoSelect() {
type Role struct {
UserID uint64 `db:"user_id"`
Name string `db:"name"`
}
type User struct {
ID uint64 `db:"id"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
type UserAndRole struct {
User User `db:"test_user"` // tag as the "test_user" table
Role Role `db:"user_role"` // tag as "user_role" table
}
db := getDB()
findUserAndRoleByName := func(name string) {
var userAndRole UserAndRole
ds := db.
From("test_user").
Join(
dbv2.T("user_role"),
dbv2.On(dbv2.I("test_user.id").Eq(dbv2.I("user_role.user_id"))),
).
Where(dbv2.C("first_name").Eq(name))
found, err := ds.ScanStruct(&userAndRole)
switch {
case err != nil:
fmt.Println(err.Error())
case !found:
fmt.Printf("No user found for first_name %s\n", name)
default:
fmt.Printf("Found user and role: %+v\n", userAndRole)
}
}
findUserAndRoleByName("Bob")
findUserAndRoleByName("Zeb")
// Output:
// Found user and role: {User:{ID:1 FirstName:Bob LastName:Yukon} Role:{UserID:1 Name:Admin}}
// No user found for first_name Zeb
}
// In this example we create a new struct that has the user properties as well as a nested
// Role struct from the join table
func ExampleSelectDataset_ScanStruct_withJoinManualSelect() {
type Role struct {
UserID uint64 `db:"user_id"`
Name string `db:"name"`
}
type User struct {
ID uint64 `db:"id"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Role Role `db:"user_role"` // tag as "user_role" table
}
db := getDB()
findUserByName := func(name string) {
var userAndRole User
ds := db.
Select(
"test_user.id",
"test_user.first_name",
"test_user.last_name",
// alias the fully qualified identifier `C` is important here so it doesnt parse it
dbv2.I("user_role.user_id").As(dbv2.C("user_role.user_id")),
dbv2.I("user_role.name").As(dbv2.C("user_role.name")),
).
From("test_user").
Join(
dbv2.T("user_role"),
dbv2.On(dbv2.I("test_user.id").Eq(dbv2.I("user_role.user_id"))),
).
Where(dbv2.C("first_name").Eq(name))
found, err := ds.ScanStruct(&userAndRole)
switch {
case err != nil:
fmt.Println(err.Error())
case !found:
fmt.Printf("No user found for first_name %s\n", name)
default:
fmt.Printf("Found user and role: %+v\n", userAndRole)
}
}
findUserByName("Bob")
findUserByName("Zeb")
// Output:
// Found user and role: {ID:1 FirstName:Bob LastName:Yukon Role:{UserID:1 Name:Admin}}
// No user found for first_name Zeb
}
func ExampleSelectDataset_ScanVals() {
var ids []int64
if err := getDB().From("test_user").Select("id").ScanVals(&ids); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("UserIds = %+v", ids)
// Output:
// UserIds = [1 2 3 4]
}
func ExampleSelectDataset_ScanVal() {
db := getDB()
findUserIDByName := func(name string) {
var id int64
ds := db.From("test_user").
Select("id").
Where(dbv2.C("first_name").Eq(name))
found, err := ds.ScanVal(&id)
switch {
case err != nil:
fmt.Println(err.Error())
case !found:
fmt.Printf("No id found for user %s", name)
default:
fmt.Printf("\nFound userId: %+v\n", id)
}
}
findUserIDByName("Bob")
findUserIDByName("Zeb")
// Output:
// Found userId: 1
// No id found for user Zeb
}
func ExampleSelectDataset_Count() {
count, err := getDB().From("test_user").Count()
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("Count is %d", count)
// Output:
// Count is 4
}
func ExampleSelectDataset_Pluck() {
var lastNames []string
if err := getDB().From("test_user").Pluck(&lastNames, "last_name"); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("LastNames = %+v", lastNames)
// Output:
// LastNames = [Yukon Yukon Yukon Doe]
}
func ExampleSelectDataset_Executor_scannerScanStruct() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
db := getDB()
scanner, err := db.
From("test_user").
Select("first_name", "last_name").
Where(dbv2.Ex{
"last_name": "Yukon",
}).
Executor().
Scanner()
if err != nil {
fmt.Println(err.Error())
return
}
defer scanner.Close()
for scanner.Next() {
u := User{}
err = scanner.ScanStruct(&u)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("\n%+v", u)
}
if scanner.Err() != nil {
fmt.Println(scanner.Err().Error())
}
// Output:
// {FirstName:Bob LastName:Yukon}
// {FirstName:Sally LastName:Yukon}
// {FirstName:Vinita LastName:Yukon}
}
func ExampleSelectDataset_Executor_scannerScanVal() {
db := getDB()
scanner, err := db.
From("test_user").
Select("first_name").
Where(dbv2.Ex{
"last_name": "Yukon",
}).
Executor().
Scanner()
if err != nil {
fmt.Println(err.Error())
return
}
defer scanner.Close()
for scanner.Next() {
name := ""
err = scanner.ScanVal(&name)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(name)
}
if scanner.Err() != nil {
fmt.Println(scanner.Err().Error())
}
// Output:
// Bob
// Sally
// Vinita
}
func ExampleForUpdate() {
sql, args, _ := dbv2.From("test").ForUpdate(exp.Wait).ToSQL()
fmt.Println(sql, args)
// Output:
// SELECT * FROM "test" FOR UPDATE []
}
func ExampleForUpdate_of() {
sql, args, _ := dbv2.From("test").ForUpdate(exp.Wait, dbv2.T("test")).ToSQL()
fmt.Println(sql, args)
// Output:
// SELECT * FROM "test" FOR UPDATE OF "test" []
}
func ExampleForUpdate_ofMultiple() {
sql, args, _ := dbv2.From("table1").Join(
dbv2.T("table2"),
dbv2.On(dbv2.I("table2.id").Eq(dbv2.I("table1.id"))),
).ForUpdate(
exp.Wait,
dbv2.T("table1"),
dbv2.T("table2"),
).ToSQL()
fmt.Println(sql, args)
// Output:
// SELECT * FROM "table1" INNER JOIN "table2" ON ("table2"."id" = "table1"."id") FOR UPDATE OF "table1", "table2" []
}