go-models-mysql go-models-mysql go-models-mysql

eehsiao2019-09-19 08:12:39 • 6641 次点击    
这是一个分享于 2019-09-19 08:12:39 的项目,其中的信息可能已经有所发展或是发生改变。

go-models-mysql

go-models-mysql its lite and easy model.

Features

  • Field scanning has become easier since the original driver was extended. Assumption: we have 5 fields to scan
    type Tb struct {
      field0 sql.NullString,
      field1 sql.NullString,
      field2 sql.NullString,
      field3 sql.NullString,
      field4 sql.NullString,
    }
    

In original driver, it can't dynamic. how many fields, that you must write fields many how. if you have 20 fileds, you must write 20 times.

var tb Tb
err = rows.Scan(&tb.field0, &tb.field1, &tb.field2, &tb.field3, &tb.field4)

In go-models-mysql , you just fill struct nil pointer.

if val, err = myDao.ScanRowType(row, (*Tb)(nil)); err == nil {
    u, _ := val.(*Tb)
    fmt.Println("Tb", u)
}
  • DAO layer let you operate mysql more Intuitively.

    • Original driver (sql.DB) was extended, so you can operate original commands.
      • ex: Query, QueryRow, Exec ....
    • Import the sqlbuilder that help access sql db easily.
      myDao.Select("Host", "User", "Select_priv").From("user").Where("User='root'").Limit(1)
      
    • Set the default table in DAO, that you can design your dao layer friendly.

      // set a struct for dao as default model (option)
      // (*UserTb)(nil) : nil pointer of the UserTb struct
      // "user" : is real table name in the db
      myUserDao.SetDefaultModel((*UserTb)(nil), "user")
      
      // call model's Get() , get all rows in user table
      // return (rows *sql.Rows, err error)
      rows, err = myDao.Get()
      

Requirements

Go-Module

create go.mod file in your package folder, and fill below

module github.com/eehsiao/go-models-example

go 1.13

require (
    github.com/eehsiao/go-models-lib latest
    github.com/eehsiao/go-models-mysql latest
    github.com/eehsiao/go-models-redis latest
    github.com/eehsiao/sqlbuilder latest
    github.com/go-sql-driver/mysql v1.4.1
)

Docker

Easy to start the test evn. That you can run the example code.

$ docker-compose up -d

Usage

import (
    "database/sql"
    "fmt"

    mysql "github.com/eehsiao/go-models-mysql"
    redis "github.com/eehsiao/go-models-redis"
)

// UserTb : sql table struct that to store into mysql
type UserTb struct {
    Host       sql.NullString `TbField:"Host"`
    User       sql.NullString `TbField:"User"`
    SelectPriv sql.NullString `TbField:"Select_priv"`
}

//new mysql dao
myUserDao := &MyUserDao{
    Dao: mysql.NewDao().SetConfig("root", "mYaDmin", "127.0.0.1:3306", "mysql").OpenDB(),
}

// example 1 : directly use the sqlbuilder
myUserDao.Select("Host", "User", "Select_priv").From("user").Where("User='root'").Limit(1)
fmt.Println("sqlbuilder", myUserDao.BuildSelectSQL())
if row, err = myUserDao.GetRow(); err == nil {
    if val, err = myUserDao.ScanRowType(row, (*UserTb)(nil)); err == nil {
        u, _ := val.(*UserTb)
        fmt.Println("UserTb", u)
    }
}

// set a struct for dao as default model (option)
// (*UserTb)(nil) : nil pointer of the UserTb struct
// "user" : is real table name in the db
myUserDao.SetDefaultModel((*UserTb)(nil), "user")

// call model's Get() , get all rows in user table
// return (rows *sql.Rows, err error)
rows, err = myDao.Get()

// call model's GetRow() , get first row in user rows
// return (row *sql.Row, err error)
row, err = myDao.GetRow()

Example

1 build-in

example.go

The example will connect to local mysql and get user data. Then connect to local redis and set user data, and get back.

2 example

https://github.com/eehsiao/go-models-example/

How-to

How to design model data logical

MySQL

1.

create a table struct, and add the tag TbField:"real table filed"

TbField the tag is musted. read table filed also be same the table field.

type UserTb struct {
    Host       sql.NullString `TbField:"Host"`
    User       sql.NullString `TbField:"User"`
    SelectPriv sql.NullString `TbField:"Select_priv"`
}

2.

use Struce4QuerySlice to gen the sqlbuilder select fields

m := mysql.NewDao().SetConfig("root", "mYaDmin", "127.0.0.1:3306", "mysql").OpenDB()
m.Select(lib.Struce4QuerySlice(m.DaoStructType)...).From(m.TbName).Limit(3)

3.

scan the sql result to the struct of object

row, err = m.GetRow()
if val, err = m.ScanRowType(row, (*UserTb)(nil)); err == nil {
    u, _ := val.(*UserTb)
    fmt.Println("UserTb", u)
}

go-models-mysql https://godoc.org/github.com/eehsiao/go-models-mysqlRead More

Latest commit to the master branch on 10-1-2019
Download as zip
授权协议:
GPL
开发语言:
go 查看源码»
6641 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传