zoukankan      html  css  js  c++  java
  • 基于gin的golang web开发:mysql增删改查

    Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动。标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx

    go get github.com/jmoiron/sqlx
    go get github.com/go-sql-driver/mysql
    

    连接数据库

    db, err := sqlx.Connect("mysql", "...?parseTime=true")
    if err != nil {
    	log.Panicln("db err: ", err.Error())
    }
    

    使用sqlx的Connect方法连接数据库,Connect自动确认是否连接成功,如果出错的话err返回错误信息。可以在需要连接数据库的函数中直接连接,也可以使用基于gin的golang web开发:访问mysql数据库中介绍的go语言init机制获取连接。

    增删改

    mysql的增删改使用db的Exec函数,传入sql语句和查询参数。sqlx也提供了MustExec函数,在sql语句执行出错的时候触发panic而不是返回error。

    db, err := sqlx.Connect("mysql", "...?parseTime=true")
    if err != nil {
    	log.Panicln("db err: ", err.Error())
    }
    defer db.Close()
    
    insertSql := `
    INSERT INTO sys_user (
      username,
      PASSWORD
    )
    VALUES
      (?, ?);
    `
    result, err := db.Db.Exec(insertSql, username, password)
    if err != nil {
    	log.Panicln("add user  err: ", err.Error())
    }
    
    updateSql := `
    update sys_user
    set username = ?
    where id = ?;
    `
    result1, err1 := db.Db.Exec(updateSql, username, id)
    if err1 != nil {
    	log.Panicln("update user by id err: ", err.Error())
    }
    
    deleteSql := `
    delete from sys_user
    where id = ?
    `
    result2, err2 := db.Db.Exec(deleteSql, id)
    if err2 != nil {
    	log.Panicln("delete user by id err: ", err.Error())
    }
    

    Exec函数的结果result接口包含两个函数LastInsertId,RowsAffected,可以判断RowsAffected > 0来验证sql语句的执行结果。注意RowsAffected不是所有数据库和驱动都支持,如果你用的不是mysql的话需要检查你的环境是否支持RowsAffected。

    sqlx支持可以方便把数据库查询结果转换成go结构体,Get和Select分别用来获取单个结果和多个结果。

    type SysUser struct {
    	Id            int         `json:"id"`
    	Username      null.String `json:"username"`
    	Password      null.String `json:"password"`                             // 登录密码
    }
    
    func GetAllUser(request GetAllUserRequest) (list []SysUser) {
    	strSql := `
    select id,
           username,
           password
    from sys_user
    `
    	err = db.Db.Select(&list, strSql)
    	if err != nil {
    		log.Panicln("select sys_user err: ", err.Error())
    	}
    
    	return
    }
    
    func GetById(id int) (user SysUser) {
    	sysUser := SysUser{}
    	dataSql := `
    select id,
           username,
           password
    from sys_user
    where id = ?
    `
    	err := db.Db.Get(&sysUser, dataSql, id)
    	if err != nil {
    		log.Panicln("get user by id err: ", err.Error())
    	}
    	return sysUser
    }
    

    Select方法获取所有结果放入内存,并转换为目标结构体,如果结果中包含大量数据的话可以分页返回,也可以使用Query/StructScan迭代方法。

    文章出处:基于gin的golang web开发:mysql增删改查

  • 相关阅读:
    第三期 预测——7.思考基于模型的方法
    第三期 预测——6.轨迹聚类2在线预测
    第三期 预测——5.数据驱动示例 轨迹簇
    第三期 预测——4.哪个最好
    第三期 预测——2.输入和输出
    第三期 预测——3 模型和数据驱动方法
    第三期 预测——1.简介
    状态和面向对象编程——7.课程大纲
    状态和面向对象编程——7.状态定量
    状态和面向对象编程——6.运动学
  • 原文地址:https://www.cnblogs.com/huaface/p/13968938.html
Copyright © 2011-2022 走看看