qb 查询

表格式及关系

package main

import (
  "fmt"
  "github.com/aacanakin/qb"
)

func main() {
  db, _ := qb.New("mysql", "root:@tcp(localhost:3306)/qb_test?charset=utf8")
  defer db.Close()

  users := qb.Table(
    "user",
    qb.Column("id", qb.Varchar().Size(36)),
    qb.Column("email", qb.Varchar().Unique().NotNull()),
    qb.Column("password", qb.Varchar().NotNull()),
    qb.Column("name", qb.Varchar().NotNull()),
    qb.PrimaryKey("id"),
  )

  sessions := qb.Table(
    "session",
    qb.Column("id", qb.Varchar().Size(36)),
    qb.Column("user_id", qb.Varchar().Size(36)),
    qb.Column("auth_token", qb.Varchar().Size(36)),
    qb.Column("created_at", qb.Timestamp().NotNull()),
    qb.Column("expires_at", qb.Timestamp().Null()),
    qb.ForeignKey().Ref("user_id", "users", "id"),
  )

  fmt.Println(users.Create(db.Dialect()))
  fmt.Println(sessions.Create(db.Dialect()))
}

简单查询

sql: SELECT id, email FROM user WHERE user.name = ?;

sel := users.
    Select(users.C("id"), users.C("email")).
    Where(users.C("name").Eq("Al Pacino")).
    Build(db.Dialect())

fmt.Println(sel.SQL())
fmt.Println(sel.Bindings())

AND 和 OR 语句

  • AND
    sql: SELECT id, email FROM user WHERE (user.name = ? AND user.email != ?);
sel := users.
    Select(users.C("id"), users.C("email")).
    Where(
      qb.And(
        users.C("name").Eq("Al Pacino"),
        users.C("email").NotEq("robert@downey.com"),
      )).
    Build(db.Dialect())

fmt.Println(sel.SQL())
fmt.Println(sel.Bindings())
  • OR
    sql: SELECT id, email FROM user WHERE (user.name = ? OR user.email != ?);
sel := users.
    Select(users.C("id"), users.C("email")).
    Where(
      qb.Or(
        users.C("name").Eq("Al Pacino"),
        users.C("email").NotEq("robert@downey.com"),
      )).
    Build(db.Dialect())

fmt.Println(sel.SQL())
fmt.Println(sel.Bindings())
  • AND 和 OR 一起使用
    sql: SELECT id, email FROM user WHERE (user.name = ? AND (user.email = ? OR user.email = ?));
sel := users.
    Select(users.C("id"), users.C("email")).
    Where(
      qb.And(
        users.C("name").Eq("Al Pacino"),
        qb.Or(
          users.C("email").Eq("al@pacino.com"),
          users.C("email").Eq("pacino@al.com"),
        ),
      )).
    Build(db.Dialect())

fmt.Println(sel.SQL())
fmt.Println(sel.Bindings())

使用连接 JOIN

sql:

SELECT session.id, session.user_id, session.created_at, session.expires_at
FROM session INNER JOIN user 
ON session.user_id = user.id
WHERE session.user_id = ?;
sel := qb.
    Select(
      sessions.C("id"),
      sessions.C("user_id"),
      sessions.C("created_at"),
      sessions.C("expires_at"),
    ).
    From(sessions).
    InnerJoin(users, sessions.C("user_id"), users.C("id")).
    Where(sessions.C("user_id").Eq("3af82cdc-4d21-473b-a175-cbc3f9119eda")).
    Build(db.Dialect())
连接方法 描述
InnerJoin(table TableElem, fromCol ColumnElem, col ColumnElem) 执行一个 INNER JOIN
LeftJoin(table TableElem, fromCol ColumnElem, col ColumnElem) 执行一个 LEFT JOIN
RightJoin(table TableElem, fromCol ColumnElem, col ColumnElem) 执行一个 RIGHT JOIN
CrossJoin(table TableElem) 执行一个 CROSS JOIN

交叉连接(笛卡尔积)不需要列连接。因此,它只有表参数。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容