Go语言学习之路(八)数据库连接与sql执行

前言

作为服务的提供者,那么必不可少的就是对数据库以及一些中间件的操作,保证前端可以稳定的从后端获取想要的数据,那么今天我们就来了解一下go语言对数据库的一些操作,这里使用mysql为例

引入依赖,加载驱动

对数据库进行操作,那么必不可少的一定是依赖了,就如同java操作数据库一定要有数据库的驱动一样,go语言也需要

import (
		// 加载数据库驱动
		_ "github.com/go-sql-driver/mysql"
)

开启连接

	db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/hb_shop")
	if err != nil {
		// 连接出错,直接panic,从这里直接退出了
		panic(err)
	}
	defer func() {
		db.Close()
	}()
	// 这里才是真正的开启连接
	db.Ping()

预编译,执行sql

我们所有的sql语句都走预编译,避免sql注入

1、查询

	query, err := db.Prepare("select * from hb_user where id = ?")
	// 一定要关闭资源
	defer func() {
		if stm != nil {
			stm.Close()
		}
	}()
	if err != nil {
		panic("预处理失败")
	}
	row := stm.QueryRow(1)
	var u User
	row.Scan(&u.Username)
	
	// 多结果处理,这里没有处理err
	rows,err := stm.Query(1)
	//循环遍历结果
	for rows.Next() {
		var u User
		//分别赋值
		rows.Scan(&u.Username)
	}

2、新增

	// 新增
	insert, err := db.Prepare("insert into hb_user values (?,?,?,?)")
	res, err := insert.Exec(1, 1, 1, 1)
	id, _ := res.LastInsertId()

3、修改

// 修改
	update, err := db.Prepare("update hb_user set username = ? where id = ?")
	updateRes,_ :=update.Exec(1, 2)
	// count 是获取的影响的行数
	count,_ := updateRes.RowsAffected()

4、删除

删除与修改的执行是一致的,实际上沃恩在做删除操作时使用的是逻辑删除

	del, err := db.Prepare("delete from hb_user where id = ?")
	delRes,_ :=update.Exec( 2)
	// count 是获取的影响的行数
	count,_ := delRes.RowsAffected()

完整代码

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

type User struct {
	Username string `json:"username"`
}

func main() {
	db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/hb_shop")
	if err != nil {
		// 连接出错,直接panic
		panic(err)
	}
	defer func() {
		db.Close()
	}()
	// 这里才是真正的开启连接
	db.Ping()
	// 查询
	query := "select * from hb_user where id = ?"
	stm, err := db.Prepare(query)
	// 一定要关闭资源
	defer func() {
		if stm != nil {
			stm.Close()
		}
	}()
	if err != nil {
		panic("预处理失败")
	}
	row := stm.QueryRow(1)
	var u User
	row.Scan(&u.Username)
	// 新增
	insert, err := db.Prepare("insert into hb_user values (?,?,?,?)")
	res, err := insert.Exec(1, 1, 1, 1)
	id, _ := res.LastInsertId()
	// 修改
	update, err := db.Prepare("update hb_user set username = ? where id = ?")
	updateRes, _ := update.Exec(1, 2)
	count, _ := updateRes.RowsAffected()
	fmt.Print(id)
	fmt.Print(u)
}

注意

  • 有异常一定要关闭资源
  • 可以直接抛出panic
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值