golang 语言学习(二) ---- gendry操作数据库

一、 滴滴开源的用于辅助操作数据库的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)
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值