一、 滴滴开源的用于辅助操作数据库的Go包
github.com/didi/gendry
二、项目结构
说明:
conf 配置文件,配置数据库信息
model 用户实体
sqls 数据库相关
main 主程序
三、直接上代码
conf/config.go
package conf
import "github.com/jinzhu/configor"
var Config = struct {
Env string `default:"dev"`
AppName string
Port int `default:"8080"`
Mysql struct {
Host string
Port int
User string
Password string
Database string
}
}{}
func init() {
err := configor.New(&configor.Config{ENVPrefix: "APP", Debug: true, ErrorOnUnmatchedKeys: true}).Load(&Config, "./conf/config.yml")
if err != nil {
panic(err)
}
}
conf/config.yml
appname: 234234
env: test
mysql:
host: localhost
port: 3306
user: root
password: 123456
database: testaa
models/users.go
package models
type User struct {
Name string `db:"username"`
Nickname string `db:"nickname"`
}
sqls/db_user.go
package sqls
import (
"database/sql"
"fmt"
"mygo2/models"
"github.com/didi/gendry/builder"
"github.com/didi/gendry/scanner"
_ "github.com/go-sql-driver/mysql"
)
type UserModel struct {
table string
db *sql.DB
}
func NewUserModel() (*UserModel, error) {
client, err := GetClient()
if err != nil {
fmt.Println(err)
}
return &UserModel{
table: "users",
db: client,
}, nil
}
func (c *UserModel) List() ([]models.User, error) {
where := map[string]interface{}{
"id": 1,
"username": "test",
"_orderby": "id desc",
}
selectFields := []string{
"username", "nickname",
}
cond, vals, err := builder.BuildSelect(c.table, where, selectFields)
if err != nil {
panic(err)
}
rows, err := c.db.Query(cond, vals...)
if err != nil {
panic(err)
}
defer rows.Close()
var users []models.User
err2 := scanner.Scan(rows, &users)
if err2 != nil {
panic(err2)
}
for _, v := range users {
fmt.Printf(v.Name)
}
return users, nil
}
sqls/db.go
package sqls
import (
"database/sql"
"fmt"
"mygo2/conf"
"time"
"github.com/didi/gendry/manager"
"github.com/didi/gendry/scanner"
)
func init() {
scanner.SetTagName("db")
GetClient()
}
var client *sql.DB
func GetClient() (*sql.DB, error) {
if client != nil {
return client, nil
}
// conf.init()
db, err := manager.New(conf.Config.Mysql.Database, conf.Config.Mysql.User, conf.Config.Mysql.Password, conf.Config.Mysql.Host).Set(
manager.SetCharset("utf8mb4"),
manager.SetAllowCleartextPasswords(true),
manager.SetInterpolateParams(true),
manager.SetTimeout(5*time.Second),
manager.SetReadTimeout(5*time.Second),
).Port(conf.Config.Mysql.Port).Open(true)
if err != nil {
return nil, err
}
db.SetConnMaxLifetime(time.Minute)
client = db
fmt.Println("[DB PING]", db.Ping())
return client, nil
}
main.go
package main
import (
"fmt"
"mygo2/conf"
"mygo2/sqls"
)
func main() {
fmt.Println(conf.Config.Mysql.Host, conf.Config.Mysql.User, conf.Config.Mysql.Password)
ad, err := sqls.NewUserModel()
if err != nil {
panic(err)
}
list, err2 := ad.List()
if err2 != nil {
panic(err2)
}
for key, _ := range list {
fmt.Printf("%v", key)
}
}