跳转至

gsd

gsd is a lightweight, fluent SQL data access library. It supports various types of database, like mysql/mssql/sqlite etc.

  • High performance
  • Support context.Context
  • Support opentracing

Configure

gsd use auxo/config package to manage database configuration. There is a sample config file in the package(app.yml):

db.sql:
    test:
      provider: mysql
      address: localhost:27017/test
      trace:
        enabled: true
        time: 1s
      options:
        max_open_conns: 100
        max_idle_conns: 1

Once you add configuration to app.yml, you can open a database like this:

db, err := gsd.Open("Test")
......

Usage

gsd provided two styles of API

  • SQL style - This one is very similar to native SQL expression
  • ORM Style

Let's define a dummy User struct first.

type User struct {
    ID         int32         `gsd:"id,pk,auto"`
    Name       string        `gsd:"name"`
    Sex        bool          `gsd:"sex"`
    Age        gsd.NullInt32 `gsd:"age"`
    Salary     float32       `gsd:"salary"`
    CreateTime string        `gsd:"create_time,insert:false"`
}

INSERT

r, err := db.Insert("user").Columns("id", "name").Values(1, "abc").Values(2, "xyz").Result()
// ...

OR

user := &User{
    ID:   100,
    Name: "abc",
}
err := db.Create(user)
// or specify columns
// err = db.Create(user, Include("id", "name"))

DELETE

_, err := db.Delete("user").Where(Equal("id", 1)).Result()
// ...

OR

user := &User{
    ID: 3,
}
r, err := db.Remove(user)

UPDATE

r, err := db.Update("user").
        Set("name", "xyz").
        Inc("c1", 1).
        Dec("c2", 1).
        Expr("c3", "c4+10").
        Where(Equal("id", 1)).
        Result()

OR

r, err := db.Modify(user)
// or ignore 'code' column
r, err = db.Modify(user, Omit("code"))

SELECT

err := db.Select("id", "name", "salary", "age", "sex", "create_time").
    From("user").
    Where(Equal("id", 2)).
    Fill(user)

A more complex example

err = db.Query(C("id", "name", "salary", "age", "sex", "create_time"), true).
    From("user").
    Join("userinfo", On("id", "auto_id")).
    Where(Equal("id", -1)).
    GroupBy(C("age")).
    Having(Equal("age", 10)).
    OrderBy(C("id").ASC()).
    Limit(10, 10).
    Fill(user)

OR

user := &User{
    ID: 3,
}
err := db.Load(user)

COUNT

err := db.Count("user").Scan(&count)
// or
count, err = db.Count("user").Value()

TRANSACTION

err := db.Transact(func(tx gsd.TX) error {
    count, err := tx.Count("user").Value()
    t.Log(count, err)
    return err
})
if err != nil {
    log.Fatal(err)
}

Proxy

gsd 可以自动生成动态代理。

func TestProxy() {
    type User struct {
        ID   int32 `gsd:",auto"`
        Name string
    }

    type UserDao struct {
        Get    func(id int32) (*User, error) `gsd:"find,cache:user.load"`
        Load   func(u *User) error           `gsd:"load,cache:user.load"`
        Remove func(u *User) error           `gsd:"remove"`
        Create func(u *User) error `gsd:"create"`
        Update func(u *User) error `gsd:"modify"`
    }

    dao := &UserDao{}
    proxy.Apply("test", dao)

    user, err := dao.Get(1)
    err = dao.Load(user)
    // ......
}

TODO