Go 数据库操作完整实例

  • 目录结构

  • 创建数据库连接对象

model.go文件

package model

import (
	"log"

	_ "github.com/go-sql-driver/mysql" // _ 只调用init函数  // sql驱动包
	"github.com/jmoiron/sqlx"          // sql操作包
)

var Db *sqlx.DB

func init() {
	db, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/news?charset=utf8&parseTime=True")
	if err != nil {
		log.Fatalln(err.Error())
	}

	Db = db
}
  •  获取数据库数据(adaptor层)

article.go文件

package model

import (
	"time"
)

// 结构体对应数据库表字段,没有用到的字段可以忽略
type Article struct {
	Id      int64     `json:"id,omitempty"`
	Title   string    `json:"title,omitempty"`
	Author  string    `json:"author,omitempty"`
	Content string    `json:"content,omitempty"`
	Hits    string    `json:"hits,omitempty"`
	utime   time.Time `json:"utime,omitempty"`
}

// 获取单条数据
func AriticleGet(id int64) (Article, error) {
	mod := Article{}
	//err := Db.Get(&mod, "select * from Article where id = ? limit 1", id)  // 数据库字段与结构体字段必须对应

	err := Db.Unsafe().Get(&mod, "select * from Article where id = ? limit 1", id) // 不检测结构体字段与数据库字段是否对应
	return mod, err
}

// 获取多条数据
func ArticleList() ([]Article, error) {
	models := make([]Article, 0, 10)
	err := Db.Unsafe().Select(&models, "select * from article limit 10")

	return models, err
}

// 删除数据 
func ArticleDel(id int64) bool {
	row, _ := Db.Exec("delete from article where id = ?", id)
	if row == nil {
		return false
	}

	// 影响行数
	rows, _ := row.RowsAffected()
	if rows >= 1 {
		return true  // 删除成功
	}
	return false
}

// 插入数据
func ArticleAdd(mod *Article) error {
	_, err := Db.Exec("insert into article(title, author, content, hits, utime) values(?,?,?,?,?)", mod.Title, mod.Author, mod.Content, mod.Hits, mod.utime)
	return err
}
  • 主函数

main.go文件,启动http服务

package main

import (
	"APP01/model"
	"encoding/json"
	"net/http"
)

// 创建一个结构体,结构体字段与数据库字段一一对应
type Class struct {
	id   int64
	name string
	desc string
}

func home(w http.ResponseWriter, r *http.Request) {

	var id int64 = 1

	// 查询sql数据
	mod, err := model.AriticleGet(id)
	if err != nil {
		// 错误处理
		Fail(w, err.Error())

		return
	}

	// 序列化数据
	json_data, _ := json.Marshal(mod)
	// 写入字节流数据
	w.Write(json_data)
}

func add(w http.ResponseWriter, r *http.Request) {

	// 获取前端Form数据
	r.ParseForm()

	mod := &model.Article{} // 初始化结构体
	mod.Title = r.Form.Get("title")
	mod.Author = r.Form.Get("author")
	mod.Content = r.Form.Get("content")
	mod.Hits, _ = strconv.Atoi(r.Form.Get("hits")) // 前端传参后是字符类型,将string类型转换成int类型
	mod.Utime = time.Now()

	// 插入数据
	err := model.ArticleAdd(mod)
	if err == nil {
		Succ(w, "删除成功")
		return
	}
	Fail(w, "添加失败")
	return

}

// 成功
func Succ(w http.ResponseWriter, msg string, data ...interface{}) {   // data 可变参数
    mod := Reply{
        code: 200
        msg: msg
    }
    if len(data) > 0 {
        mod.data = data[0]
    }
    buf, _ := json.Marshal(mod)
    w.Header().Set("Content-Type", "application/json")
	w.Write(buf)
}

// 失败
func Fail(w http.ResponseWriter, msg string, data ...interface{}) {
	mod := Reply{
        code: 300  
        msg: msg
    }
    if len(data) > 0 {
        mod.data = data[0]
    }
    buf, _ := json.Marshal(mod)
    w.Header().Set("Content-Type", "application/json")
	w.Write(buf)
}

type Reply struct {
    code int64          // 状态标识
    msg string          // 用户提示信息
    data interface{}    // 返回数据
}


// sql操作
func main() {
	// 创建路由
	http.HandleFunc("/home", home)
	http.HandleFunc("/add", add) // 添加数据
	// 监听端口
	http.ListenAndServe(":8080", nil)
}

Guess you like

Origin blog.csdn.net/weixin_40123451/article/details/120947091