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 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> golang:连接 Mysql 数据库并进行CRUD操作 -> 正文阅读

[大数据]golang:连接 Mysql 数据库并进行CRUD操作

1、创建数据库表

create table student (
	id int NOT NULL AUTO_INCREMENT,
	name varchar(20),
	age int
)

2、添加数据

insert into student values(1001,"lena",21),(1002,"titiy",22);

3、go get mysql

如果是第一次连接mysql数据库,需要先拉取mysql所需要的包
go get -u github.com/go-sql-driver/mysql
该过程我遇到了一个代理失败的error,如相同可参考:https://blog.csdn.net/lena7/article/details/120254809

4、Golang测试连接数据库

由于在实际中并未使用到mysql的包,但在sql.Open中传入mysql会自动查找mysql,并不是直接使用到,我使用的工具Goland会自动将未直接使用导包删除掉,因此我们可以在mysql的导包前面加_

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"	// 必须导入否则无法识别mysql
)

func ConnMysql() {
	// 格式:账号:密码@tcp(数据库ip:数据库端口)/数据库名称
	url := "root:root@tcp(127.0.0.1:3306)/test"
	// func Open(数据库驱动名称,连接信息) (*DB, error)
	db, err := sql.Open("mysql", url)
	if err != nil {
		fmt.Println("conn err :",err)
		return
	}
	defer db.Close()
	// 尝试链接
	err = db.Ping()
	if err != nil {
		fmt.Println("ping err :",err)
		return
	}
	fmt.Println("conn success!")	// conn success!
}

如果连接失败,可以进行以下尝试:

  1. 首先打开电脑的命令行模式,输入mysql看看是否有信息,如果没有,可能是未启动mysqld服务、没有配置环境变量等原因。
  2. 使用命令mysql -u 账号 -p回车后输入密码,查看是否能够进入数据库。如果在命令行能够进入,连接应该没什么问题。

CRUD操作

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

var db *sql.DB

func Conn() {
	url := "root:root@tcp(127.0.0.1:3306)/test"
	db, _ = sql.Open("mysql", url)
	// 尝试链接
	err := db.Ping()
	if err != nil {
		fmt.Println("ping err :",err)
		return
	}
	fmt.Println("conn success!")	// conn success!
}

/**
	创建student结构体用于操作数据库表student
	create table student (
		id int primary key,
		name varchar(20),
		age int
 */
type Student struct {
	id int
	name string
	age int
}

// 查询一条记录:QueryRow
func QueryOne(id int) Student {
	sql := "select * from student where id = ?"
	s:=Student{}
	// 查询后需要用Scan将查询结果写入结构体中
	err := db.QueryRow(sql,id).Scan(&s.id, &s.name, &s.age)
	if err != nil {
		fmt.Println("select err :",err)
	}
	return s
}

// 查询多条记录
func QueryAgeMore(age int) []Student {
	sql := "select * from student where age > ?"
	rows, err := db.Query(sql, age)
	if err != nil {
		fmt.Println("select err :",err)
		return nil
	}
	defer rows.Close()
	var students []Student
	// 当有下一行时返回true
	for rows.Next() {
		var s Student
		err := rows.Scan(&s.id, &s.name, &s.age)
		if err != nil {
			fmt.Println("scan err :",err)
			break
		}
		students=append(students, s)
	}
	return students
}

// 写操作(增删改)都使用Exec方法
// 新增数据:返回自增的id
func Insert(s Student) int {
	sql := "insert into student(name,age) values(?,?)"
	res, err := db.Exec(sql,s.name, s.age)
	if err != nil {
		fmt.Println("insert err :",err)
		return 0
	}
	id, err := res.LastInsertId()	// 返回的id属性列必须是自动递增的
	if err != nil {
		fmt.Println("get last id err :",err)
		return s.id
	}
	return int(id)
}

// 更新数据:返回影响行数
func UpdateOne(s Student) int {
	sql := "update student set age = ? where id = ?"
	res, err := db.Exec(sql, s.age, s.id)
	if err != nil {
		fmt.Println("update err :",err)
		return 0
	}
	i, err := res.RowsAffected()
	if err != nil {
		fmt.Println("get effected row num err :",err)
		return 0
	}
	return int(i)
}

// 删除数据
func DeleteOne(id int) int {
	sql := "delete from student where id = ?"
	res, err := db.Exec(sql, id)
	if err != nil {
		fmt.Println("delete err :",err)
		return 0
	}
	i, err := res.RowsAffected()
	if err != nil {
		fmt.Println("get effected row num err :",err)
		return 0
	}
	return int(i)
}

测试代码

import (
    "fmt"
    "reflect"
    "testing"
)


func TestQueryOne(t *testing.T) {
    Conn()
	s := QueryOne(1001)
	var expert=Student{1001,"lena",21}
    if !reflect.DeepEqual(s,expert) {
        t.Errorf("result is %v,not expert %v",s,expert)
    }
}

func TestQueryAgeMore(t *testing.T) {
    Conn()
    // 查询十岁以上的学生
    s := QueryAgeMore(10)
    fmt.Println(s)  // [{1001 lena 21} {1002 kity 20}]
}

func TestInsert(t *testing.T) {
    Conn()
    s:=Student{0,"tity",15}
    res := Insert(s)
    if !reflect.DeepEqual(res,1005) {
        t.Errorf("res = %v",res)
    }
}

func TestUpdateOne(t *testing.T) {
    Conn()
    s:=Student{1004,"peity",18}
    i := UpdateOne(s)
    if !reflect.DeepEqual(i,1) {
        t.Errorf("reflected row : %v",i)
    }
}

func TestDeleteOne(t *testing.T) {
    Conn()
    i := DeleteOne(1005)
    if !reflect.DeepEqual(i,1) {
        t.Errorf("reflected row : %v",i)
    }
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:20:26  更:2021-09-13 09:22:52 
 
开发: 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/23 20:53:52-

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