Categorygithub.com/trewanek/query-builder
repositorypackage
0.0.0-20200302160801-f631e0c9f35d
Repository: https://github.com/trewanek/query-builder.git
Documentation: pkg.go.dev

# README

query-builder

query-builder's purpose is build sql queries.

execute Query or execute Exec is not purpose this library.

Please use this with database/sql or jmoiron/sqlx or etc.

Characteristic

  • Method chain
  • Immutable

Builder Types

  • SelectQueryBuilder
  • InsertQueryBuilder
  • UpdateQueryBuilder
  • DeleteQueryBuilder

How to use examples

SelectQueryBuilder

//example model
type User struct {
	UserID string `db:"user_id" table:"users"`
	Name   string `db:"name" table:"users"`
	Age    int    `db:"age" table:"users"`
	Sex    string `db:"sex" table:"users"`
}
# All Columns select
# SELECT users.* FROM users;
NewSelectQueryBuilder().Table("users").Build()

# Columns By struct select
# SELECT users.user_id, users.name, users.age, users.sex FROM users;
NewSelectQueryBuilder().Table("users").Model(User{}).Build()

# Columns select
# SELECT users.name, users.age, users.sex FROM users;
NewSelectQueryBuilder().Table("users").Column("name", "age", "sex").Build()

# Use GroupBy
# SELECT users.* FROM users GROUP BY user_id;
NewSelectQueryBuilder().Table("users").GroupBy("user_id").Build()

# Use OrderBy
# SELECT users.* FROM users ORDER BY created ASC;
NewSelectQueryBuilder().Table("users").OrderBy("created", Asc).Build()

# Use Limit
# SELECT users.* FROM users LIMIT ?;
NewSelectQueryBuilder().Table("users").Limit().Build()

# Use Offset
# SELECT users.* FROM users LIMIT ? OFFSET ?;
NewSelectQueryBuilder().Table("users").Limit().Offset().Build()

# Use Where
# SELECT users.* FROM users WHERE name = ? AND age >= ? AND age <= ? AND sex != ? AND age < ? AND age > ?;
NewSelectQueryBuilder().
    Table("users").
    Where("name", Equal).
    Where("age", GraterThanEqual).
    Where("age", LessThanEqual).
    Where("sex", NotEqual).
    Where("age", LessThan).
    Where("age", GraterThan).
    Build()

# Select Placeholder(default is `?`)
# SELECT users.* FROM users WHERE name = :name AND age >= :age AND age <= :age AND sex != :sex AND age < :age AND age > :age;
NewSelectQueryBuilder().
    Placeholder(Named).
    Table("users").
    Where("name", Equal).
    Where("age", GraterThanEqual).
    Where("age", LessThanEqual).
    Where("sex", NotEqual).
    Where("age", LessThan).
    Where("age", GraterThan).
    Build()

# Select custom Placeholder(default `Named` is `column_name`)
# SELECT users.* FROM users WHERE name = :name AND age >= :age1 AND age <= :age2 AND sex != :sex1 AND age < :age3 AND age > :age4;
NewSelectQueryBuilder().
    Placeholder(Named).
    Table("users").
    Where("name", Equal).
    Where("age", GraterThanEqual, "age1").
    Where("age", LessThanEqual, "age2").
    Where("sex", Not, "sex1").
    Where("age", LessThan, "age3").
    Where("age", GraterThan, "age4").
    Build()

# Use IN(?)
# SELECT users.* FROM users WHERE user_name = ? AND user_id IN (?, ?, ?);
NewSelectQueryBuilder().
    Table("users").
    Where("user_name", Equal).
    WhereIn("user_id", 3).
    Build()

# Use IN(:named)
# SELECT users.* FROM users WHERE user_name = :user_name AND user_id IN (:user_id1, :user_id2, :user_id3);
NewSelectQueryBuilder().
    Placeholder(Named).
    Table("users").
    Where("user_name", Equal).
    WhereIn("user_id", 3).
    Build()

# Use NOT IN(?)
# SELECT users.* FROM users WHERE user_name = ? AND user_id IN (?, ?, ?);
NewSelectQueryBuilder().
    Table("users").
    Where("user_name", Equal).
    WhereNotIn("user_id", 3).
    Build()

# Use NOT IN(:named)
# SELECT users.* FROM users WHERE user_name = :user_name AND user_id IN (:user_id1, :user_id2, :user_id3);
NewSelectQueryBuilder().
    Table("users").
    Placeholder(Named).
    Where("user_name", Equal).
    WhereNotIn("user_id", 3).
    Build()

# Use Where Bind By Struct
# SELECT machines.* FROM machines WHERE machine_number = :machine_number AND machine_name = :machine_name AND buy_date >= :buy_date_from AND buy_date < :buy_date_to AND price > :price_from AND price <= :price_to AND owner != :owner;
# Ex Struct
type SearchMachinesParameter struct { //ex Tagged struct
    MachineNumber int       `db:"machine_number" search:"machine_number" operator:"eq"`
    MachineName   string    `db:"machine_name" search:"machine_name" operator:"eq"`
    BuyDateFrom   time.Time `db:"buy_date" search:"buy_date_from" operator:"gte"`
    BuyDateTo     time.Time `db:"buy_date" search:"buy_date_to" operator:"lt"`
    PriceFrom     int       `db:"price" search:"price_from" operator:"gt"`
    PriceTo       int       `db:"price" search:"price_to" operator:"lte"`
    Owner         string    `db:"owner" search:"owner" operator:"ne"`
}
NewSelectQueryBuilder().
    Placeholder(Named).
    Table("machines").
    WhereMultiByStruct(searchParam).
    Build()

# Use Join
# SELECT users.* FROM users LEFT JOIN tasks ON users.user_id = tasks.user_id;
joinFields := []string{"user_id"}
NewSelectQueryBuilder().
    Placeholder(Named).
    Table("users").
    Join(LeftJoin, "tasks", joinFields, joinFields).Build()

# Use Join with Named Parameter
# SELECT users.* FROM users LEFT JOIN tasks ON users.user_id = tasks.task_user_id AND users.user_task_id = tasks.task_id;
originFields := []string{"user_id", "user_task_id"}
targetFields := []string{"task_user_id", "task_id"}
NewSelectQueryBuilder().
    Table("users").
    Join(LeftJoin, "tasks", originFields, targetFields).
    Build()

# Multi Field Join
# SELECT users.* FROM users LEFT JOIN tasks ON users.user_id = tasks.user_id AND users.task_id = tasks.task_id;
fields := []string{"user_id", "task_id"}
NewSelectQueryBuilder().Table("users").
    Join(LeftJoin, "tasks", fields, fields).
    Build()

# Use SubQuery
# SELECT users.* FROM users WHERE user_id = (SELECT users.user_id FROM users);
NewSelectQueryBuilder().
    Table("users").
    WhereSubQuery(
        "user_id",
        Equal,
        NewSelectQueryBuilder().Table("users").Column("user_id"),
    ).
    Build()

InsertQueryBuilder

# Select Columns
# INSERT INTO users(name, age, sex) VALUES(?, ?, ?);
NewInsertQueryBuilder().
    Table("users").
    Column("name", "age", "sex").
    Build()

# INSERT INTO users(name, age, sex) VALUES(:name, :age, :sex);
NewInsertQueryBuilder().
    Placeholder(Named).
    Table("users").
    Column("name", "age", "sex").
    Build()

# Select By Model
# INSERT INTO users(user_id, name, age, sex) VALUES(?, ?, ?, ?);
NewInsertQueryBuilder().
    Table("users").
    Model(User{}).
    Build()

# INSERT INTO users(user_id, name, age, sex) VALUES(:user_id, :name, :age, :sex);
NewInsertQueryBuilder().
    Placeholder(Named).
    Table("users").
    Model(User{}).
    Build()

UpdateQueryBuilder

# Select Columns
# UPDATE users SET name = ?, age = ?, sex = ?;
NewUpdateQueryBuilder().
    Table("users").
    Column("name", "age", "sex").
    Build()

# UPDATE users SET name = :name, age = :age, sex = :sex;
NewUpdateQueryBuilder().
    Placeholder(Named).
    Table("users").
    Column("name", "age", "sex").
    Build()

# Use Where
# UPDATE users SET name = ?, age = ?, sex = ? WHERE name = ? AND age >= ? AND age <= ? AND sex != ? AND age < ? AND age > ?;
NewUpdateQueryBuilder().
    Table("users").
    Column("name", "age", "sex").
    Where("name", Equal).
    Where("age", GraterThanEqual).
    Where("age", LessThanEqual).
    Where("sex", NotEqual).
    Where("age", LessThan).
    Where("age", GraterThan).
    Build()

# Use IN(?)
# UPDATE users SET name = ?, age = ?, sex = ? WHERE user_name = ? AND user_id IN (?, ?, ?);
NewUpdateQueryBuilder().
    Table("users").
    Column("name", "age", "sex").
    Where("user_name", Equal).
    WhereIn("user_id", 3).
    Build()

# Use NOT IN(?)
# UPDATE users SET name = ?, age = ?, sex = ? WHERE user_name = ? AND user_id NOT IN (?, ?, ?);
NewUpdateQueryBuilder().
    Table("users").
    Column("name", "age", "sex").
    Where("user_name", Equal).
    WhereNotIn("user_id", 3).
    Build()

DeleteQueryBuilder

# All Delete
# DELETE FROM users;
NewDeleteQueryBuilder().
    Table("users").
    Build()

# Use Where
# DELETE FROM users WHERE name = ? AND age >= ? AND age <= ? AND sex != ? AND age < ? AND age > ?;
NewDeleteQueryBuilder().
    Table("users").
    Where("name", Equal).
    Where("age", GraterThanEqual).
    Where("age", LessThanEqual).
    Where("sex", NotEqual).
    Where("age", LessThan).
    Where("age", GraterThan).
    Build()

# Use IN(?)
# DELETE FROM users WHERE user_name = ? AND user_id IN (?, ?, ?);
NewDeleteQueryBuilder().
    Table("users").
    Where("user_name", Equal).
    WhereIn("user_id", 3).
    Build()

# Use NOT IN(?)
# DELETE FROM users WHERE user_name = ? AND user_id NOT IN (?, ?, ?);
NewDeleteQueryBuilder().Table("users").
    Where("user_name", Equal).
    WhereNotIn("user_id", 3).
    Build()

Install

go get -u github.com/trewanek/query-builder