IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Go连接Mysql执行crud -> 正文阅读

[大数据]Go连接Mysql执行crud

Go原生提供了连接数据库操作的支持,在用 Golang进行开发的时候,如果需要在和数据库交互,则可以使用database/sql包。这是一个对关系型数据库的通用抽象,它提供了标准的、轻量的、面向行的接口。

sql包提供了保证SQL或类SQL数据库的泛用接口。
使用sql包时必须注入(至少)一个数据库驱动。

使用的驱动为: github.com/go-sql-driver/mysql
导入的包

	"database/sql"
	_ "github.com/go-sql-driver/mysql"

在连接mysql之前,先准备一个数据库和一张表
数据库为test
表结构

create table users (
	`id` int PRIMARY KEY auto_increment,
	`username` VARCHAR(100) not null unique,
	`password` VARCHAR(100) not NULL,
	`email` VARCHAR(100) not null
)
  1. 连接数据库
    创建utils/db.go
package utils

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

var (
	Db *sql.DB
	err error
)

func init() {
	Db, err = sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test")
	if err != nil {
		fmt.Println("mysql connect failed err: ", err.Error())
		panic(err.Error())
	}
}

2.创建model/user.go

package model

import (
	"fmt"
	"go-web-book-shop/utils"
)

//User
type User struct {
	ID int
	Username string
	Password string
	Email string
}

//AddUser 添加用户 - 预编译
func (user *User) AddUser() error {
	// sql语句
	sql := "insert into users(username, password, email) values (?, ?, ?)"
	// 预编译
	insertStmt, err := utils.Db.Prepare(sql)
	if err != nil {
		fmt.Println("预编译出现异常: ", err)
		return err
	}
	// 执行
	_, err = insertStmt.Exec("admin3", "123456", "zhangsan@163.com")
	if err != nil {
		fmt.Println("数据写入失败: ", err)
		return err
	}
	return nil
}

//AddUser2 添加用户 Exec
func (user *User) AddUser2() error {
	// sql语句
	sql := "insert into users(username, password, email) values (?, ?, ?)"
	// 执行
	_, err := utils.Db.Exec(sql, "admin4", "123456", "lisi@163.com")
	if err != nil {
		fmt.Println("数据写入失败!: ", err)
		return err
	}

	return nil
}

//Del 根据ID删除用户
func (user *User) Del() error {
	sql := "delete from users where id = ?"
	stmt, err := utils.Db.Prepare(sql)
	if err != nil {
		fmt.Println("预编译失败...")
		return err
	}

	_, err = stmt.Exec(4)
	if err != nil {
		fmt.Println("执行删除语句失败")
		return err
	}

	return nil
}

//UpdateUserById 根据ID修改用户信息
func (user *User) UpdateUserById() error {
	sql := "update users set username = ?, password = ?, email = ? where id = ?"
	stmt, err := utils.Db.Prepare(sql)
	if err != nil {
		fmt.Println("预编sql失败: ", err)
		return err
	}
	_, err = stmt.Exec("admin", "123456", "123456@163.com", 4)
	if err != nil {
		fmt.Println("执行修改sql语句失败: ", err)
		return err
	}
	return nil
}

//QueryOne 查询一条记录
func (user *User) QueryOne() (*User, error) {
	// sql语句
	sql := "select * from users where id = ?"
	// 执行
	row := utils.Db.QueryRow(sql, user.ID)
	// 声明变量接受扫描出来的数据
	var id       int
	var username string
	var password string
	var email    string
	err := row.Scan(&id, &username, &password, &email)
	if err != nil {
		fmt.Println("查询失败:", err)
		return nil, err
	}
	u := &User{
		ID:       id,
		Username: username,
		Password: password,
		Email:    email,
	}
	return u, nil
}

//QueryAll 查询全部记录
func (user *User) QueryAll() ([]*User, error) {
	sql := "select * from users"
	rows, err := utils.Db.Query(sql)
	if err != nil {
		fmt.Println("执行sql语句失败: ", err)
		return nil, err
	}

	// 创建User 切片
	var users []*User

	for rows.Next() {
		var id       int
		var username string
		var password string
		var email    string
		err = rows.Scan(&id, &username, &password, &email)
		if err != nil {
			return nil, err
		}

		u := &User{
			ID:       id,
			Username: username,
			Password: password,
			Email:    email,
		}

		users = append(users, u)
	}
	return users, nil
}

3.创建model/user_test.go单元测试文件

package model

import (
	"fmt"
	"testing"
)

//TestMain 测试函数执行之前的函数
func TestMain(m *testing.M) {
	m.Run()
}

//TestUser 测试User 中的方法
func TestUser(t *testing.T) {
	fmt.Println("开始测试User中的相关的方法")

	// 通过t.Run()执行子测试函数
	t.Run("测试添加用户", testUser_QueryAll) // 
}

//testUser_AddUser 测试添加用户
func testUser_AddUser(t *testing.T) {
	fmt.Println("测试添加用户...")
	user := &User{}
	user.AddUser()
	user.AddUser2()
}

//testUser_De 测试删除用户
func testUser_Del(t *testing.T) {
	fmt.Println("测试删除用户...")
	user := &User{}
	user.Del()
}

//testUser_UpdateUserById 测试通过ID修改用户信息
func testUser_UpdateUserById(t *testing.T) {
	fmt.Println("测试通过ID修改用户信息...")
	user := &User{}
	user.UpdateUserById()
}

//testUser_QueryOne 测试查询一条数据
func testUser_QueryOne(t *testing.T) {
	fmt.Println("测试查询一条数据...")
	user := &User{
		ID: 15,
	}
	u, _ := user.QueryOne()
	fmt.Println("查询id为15的记录为: ", u)
}

//testUser_QueryAll 测试获取所有的数据
func testUser_QueryAll(t *testing.T) {
	fmt.Println("测试获取所有的数据...")
	user := User{}
	users, _ := user.QueryAll()
	for k, v := range users{
		fmt.Printf("第%d个用户是: %v: \n", k+1, v)
	}
}

4.执行单元测试 go test

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:27:35  更:2022-03-16 22:27:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:04:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码