操作 数据库

Go 语言中的 database/sql 包定义了对数据库的一系列操作。database/sql/driver

包定义了应被数据库驱动实现的接口,这些接口会被 sql 包使用。但是 Go 语言没有提

供任何官方的数据库驱动,所以我们需要导入第三方的数据库驱动。不过我们连接数据

库之后对数据库操作的大部分代码都使用 sql 包。

获取数据库连接

Open 函数的说明

  • 参数 dataSourceName 的格式:

    数据库用户名:数据库密码@[tcp(localhost:3306)]/数据库名
  • Open 函数可能只是验证其参数,而不创建与数据库的连接。如果要检查数据

    源的名称是否合法,应调用返回值的 Ping 方法。
  • 返回的 DB 可以安全的被多个 go 程同时使用,并会维护自身的闲置连接池。

    这样一来,Open 函数只需调用一次。很少需要关闭 DB
package utils

import (
"database/sql" _ "github.com/go-sql-driver/mysql"
) var (
Db *sql.DB
err error
) func init() {
Db, err = sql.Open("mysql", "root:ygj1007502524@tcp(localhost:3306)/test")
if err != nil {
panic(err.Error())
}
}

增删改操作

在连接的 test 数据库中创建一个 users 表

CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) UNIQUE NOT NULL,
PASSWORD VARCHAR(100) NOT NULL,
email VARCHAR(100)
)

向 users 表中插入记录

package model

import (
"fmt"
"go_code/go-web/day01/web01_db/utils"
) //User 结构体
type User struct {
ID int
Username string
Password string
Email string
} //AddUser 添加User的方法一
func (user *User) AddUser() error {
//1.写sql语句
sqlStr := "insert into users(username,password,email) values(?,?,?)"
//2.预编译
inStmt, err := utils.Db.Prepare(sqlStr)
if err != nil {
fmt.Println("预编译出现异常:", err)
return err
}
//3.执行
_, err2 := inStmt.Exec("admin", "123456", "admin@atguigu.com")
if err2 != nil {
fmt.Println("执行出现异常:", err2)
return err
}
return nil
} //AddUser2 添加User的方法二
func (user *User) AddUser2() error {
//1.写sql语句
sqlStr := "insert into users(username,password,email) values(?,?,?)"
//2.执行
_, err := utils.Db.Exec(sqlStr, "admin2", "666666", "admin2@sina.com")
if err != nil {
fmt.Println("执行出现异常:", err)
return err
}
return nil
}

单元测试

简介

顾名思义,单元测试( unit test),就是一种为验证单元的正确性而设置的自动化测

试,一个单元就是程序中的一个模块化部分。一般来说,一个单元通常会与程序中的一

个函数或者一个方法相对应,但这并不是必须的。Go 的单元测试需要用到 testing 包

以及 go test 命令,而且对测试文件也有以下要求

  1. 被测试的源文件和测试文件必须位于同一个包下
  2. 测试文件必须要以_test.go 结尾
  • 虽然 Go 对测试文件_test.go 的前缀没有强制要求,不过一般我们都设置

    为被测试的文件的文件名,如:要对 user.go 进行测试,那么测试文件的

    名字我们通常设置为 user_test.go
  1. 测试文件中的测试函数为 TestXxx(t *testing.T)
  • 其中 Xxx 的首字母必须是大写的英文字母
  • 函数参数必须是 test.T 的指针类型(如果是 Benchmark 测试则参数是

    testing.B 的指针类型)

测试代码:

package model

import (
"fmt"
"testing"
) //TestMain函数可以在测试函数执行之前做一些其他操作
func TestMain(m *testing.M) {
fmt.Println("测试开始:")
//通过m.Run()来执行测试函数
m.Run()
} func TestUser(t *testing.T) {
fmt.Println("开始测试User中的相关方法")
//通过t.Run()来执行子测试函数
t.Run("测试添加用户:", testAddUser)
} //如果函数名不是以Test开头,那么该函数默认不执行,我们可以将它设置成为一个子测试函数
func testAddUser(t *testing.T) {
fmt.Println("子测试函数执行:")
user := &User{}
//调用添加用户的方法
user.AddUser()
user.AddUser2()
}

testing 包的说明

如果一个测试函数的函数名的不是以 Test 开头,那么在使用 go test 命令时默

认不会执行,不过我们可以设置该函数时一个子测试函数,可以在其他测试函

我们还可以通过 TestMain(m *testing.M)函数在测试之前和之后做一些其他

的操作

a) 测试文件中有 TestMain 函数时,执行 go test 命令将直接运行 TestMain

函数,不直接运行测试函数,只有在 TestMain 函数中执行 m.Run()时才

会执行测试函数

b) 如果想查看测试的详细过程,可以使用 go test -v 命令

获取一条记录

func (user *User) GetUserByID(userId int) (*User, error) {
//写 sql 语句
sqlStr := "select id , username , password , email from users where id = ?"
//执行 sql
row := utils.Db.QueryRow(sqlStr, userId)
//声明三个变量
var username string
var password string
var email string
//将各个字段中的值读到以上三个变量中
err := row.Scan(&userId, &username, &password, &email)
if err != nil {
return nil, err
}
//将三个变量的值赋给 User 结构体
u := &User{
ID: userId,
Username: username,
Password: password,
Email: email,
}
return u, nil
}

获取多条记录

func (user *User) GetUsers() ([]*User, error) {
//写 sql 语句
sqlStr := "select id , username , password , email from users"
//执行 sql
rows, err := utils.Db.Query(sqlStr)
if err != nil {
return nil, err
}
//定义一个 User 切片
var users []*User
//遍历
for rows.Next() {
//声明四个个变量
var userID int
var username string
var password string
var email string
//将各个字段中的值读到以上三个变量中
err := rows.Scan(&userID, &username, &password, &email)
if err != nil {
return nil, err
}
//将三个变量的值赋给 User 结构体
u := &User{
ID: userID,
Username: username,
Password: password,
Email: email,
}
//将 u 添加到 users 切片中
users = append(users, u)
}
return users, nil
}

goweb-mysql连接的更多相关文章

  1. 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。

    解决Mysql连接池被关闭  ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...

  2. 安装Hive(独立模式 使用mysql连接)

    安装Hive(独立模式 使用mysql连接) 1.默认安装了java+hadoop 2.下载对应hadoop版本的安装包 3.解压安装包 tar zxvf apache-hive-1.2.1-bin. ...

  3. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  4. mysql连接的一些问题。

    最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问 ...

  5. 一则线上MySql连接异常的排查过程

    Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过程中 ...

  6. Navicat for MySQL连接MYSQL出错,错误代码1045的解决方法

    Navicat for MySQL连接MYSQL

  7. Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'

    在远程连接mysql的时候,连接不上,出现如下报错:Lost connection to MySQL server at 'waiting for initial communication pack ...

  8. MySQL连接池

    1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...

  9. Linux下巧用my.cnf,mysql连接服务器不需要输入账号密码信息

    Linux下每次用mysql连接连接服务器,常常用如下方式: [root@localhost ~]# mysql -hlocalhost -uroot -p11111 每次都输入用户名,密码,多折腾人 ...

  10. mysql连接查询经典小例题

    mysql连接查询: Mysql连接查询支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表: ...

随机推荐

  1. Java代码~~汽车租赁系统

    租车信息: 输出结果: 代码: 1.先定义抽象类(汽车类:Moto) package cn.aura.demo01; public abstract class Moto { //公共属性 priva ...

  2. Mysql数据库的主从与主主

    前言: 首先,我们得知道我们为什么要做数据库的主从与主主,而后,再讨论他们的优劣与特点:为什么要做主从呢?因为Mysql数据库没有增量备份的机制,当数据量太大的时候备份是个难以解决的问题.但是mysq ...

  3. vue-其他

    vue-resource // 2.1 导入 vue-resource import VueResource from 'vue-resource' // 2.2 安装 vue-resource Vu ...

  4. UiPath Platform注册 登录 及 访问 Orchestrator

    相关步骤: 1.https://platform.uipath.com/portal_/cloudrpa 注册 及 登录 2. Login后 通过Services 连接 访问 UiPath Orche ...

  5. 轻松玩转windows之redis实战

    Redis是一个常用的键值对数据库.本篇分享一下如何轻松在睿江云上实现基于windows的redis开发环境. 1. 登录睿江云 点击右上角登录框 ​ 进入登录页面,输入账号密码登录 ​ 进入控制台, ...

  6. Appium(八):Appium API(二) 元素等待、元素操作

    1. 元素等待 我们在使用脚本的时候,可能会由于网络.服务器处理.电脑等原因,我们想要找的元素没有加载出来,这个时候如果直接定位就可能会报错. 这个时候我们就可以设置元素等待了. 什么叫元素等待呢? ...

  7. tl-wr742n 怎么设置dns

    打开无线路由器,用笔记本设置,点击无线网络,点击连接需要设置的无线路由  在弹出的菜单点击[是]  在无线路由器有的背面有个标签,上面PIN码,输入PIN码  打开IE浏览器在地址栏输入192.168 ...

  8. Python @classmethod和@staticmethod装饰器使用介绍

    @classmethod和@staticmethod装饰器使用介绍 by:授客 QQ:1033553122 简介 静态方法:类中用 @staticmethod装饰的不带 self 参数的方法.类的静态 ...

  9. JS---part2课程介绍+part1复习

    part1复习 JavaScript分三个部分: 1. ECMAScript标准----JS基本的语法 2. DOM:Document Object Model 文档对象模型 3. BOM:浏览器对象 ...

  10. LRC歌词原理和实现高仿Android网易云音乐

    大家好,我们是爱学啊,今天给大家带来一篇关于LRC歌词原理和在Android上如何实现歌词逐行滚动的效果,本文来自[Android开发项目实战我的云音乐]课程:逐字滚动下一篇文章讲解. 效果图 相信大 ...