数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。

这里不对数据库的知识做过多介绍,想要对数据库有更深的了解可以点这里,我在这里只介绍下golang对数据库的操作方式。至于通过gorm来操作数据库,则在下篇文章再讲解。

因为我也是初学,所以这里只列举了用golang操作数据库的简单操作,复杂操作以后学会了再补。

一、安装驱动

在Git命令行中输入

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

回车之后等待一会,等提示可以再输入命令时,就说明驱动已经装好了。

二、导入mysql包

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

三、对数据库的操作

1、数据库的连接

db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8");
	//root为数据库用户名,后面为密码,tcp代表tcp协议,test处填写自己的数据库名称

2、数据库查询

type info struct {
		id int `db:"id"`
		name string `db:"name"`
		age int `db:"age"`
		sex string `db:"sex"`
		salary int `db:"salary"`
		work string `db:"work"`
		inparty string `db:"inparty"`
	}

首先可以先定义一个结构体用来保存读出的每条数据,当然如果只需要其中某些数据,也可以按照自己的需要修改结构体,这里用我自己创建的表来演示。

rows,err:=db.Query("SELECT * FROM message")

这条语句用来将表中所有的条无条件的读出保存到rows中。

接下来是数据的逐条输出:

for rows.Next(){
		var s info
		err=rows.Scan(&s.id,&s.name,&s.age,&s.sex,&s.salary,&s.work,&s.inparty,)
		fmt.Println(s)
	}

for rows.next可以一直读到表格的末尾。

下面是完整的查询代码:

import (
	_"mysql"
	"database/sql"
	"fmt"
)

func check(err error){     //因为要多次检查错误,所以干脆自己建立一个函数。
	if err!=nil{
		fmt.Println(err)
	}

}


func main(){
	db,err:=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/employee")
	check(err)

	//query
	type info struct {
		id int `db:"id"`
		name string `db:"name"`
		age int `db:"age"`
		sex string `db:"sex"`
		salary int `db:"salary"`
		work string `db:"work"`
		inparty string `db:"inparty"`
	}
	rows,err:=db.Query("SELECT * FROM message")
	check(err)
	for rows.Next(){
		var s info
		err=rows.Scan(&s.id,&s.name,&s.age,&s.sex,&s.salary,&s.work,&s.inparty,)
		check(err)
		fmt.Println(s)
	}
	rows.Close()

可以看到表格中的内容如下:

go语言 流数据分发 go语言操作数据库_go语言 流数据分发

如果需要按条件查询的话,可以使用mysql语句的where:

rows,err:=db.Query("SELECT name,age FROM message where id=2")
	check(err)
	for rows.Next(){
		var s info
		err=rows.Scan(&s.name,&s.age)
		check(err)
		fmt.Println(s)
	}

可以看到只输出了符合查询条件的结果的部分列。

go语言 流数据分发 go语言操作数据库_sql_02

3、数据库增加条目

result,err:=db.Exec("INSERT INTO message(id,name,age,sex,salary,work,inparty)VALUES (?,?,?,?,?,?,?)",7,"李白",80,"男",1000,"中","是")
	check(err)

这里增加了一个条目,这个时候再查询就可以看到表中增加了一条,正是我们插入的那条数据。

go语言 流数据分发 go语言操作数据库_sql_03

4、数据库的更新

results,err:=db.Exec("UPDATE message SET salary=? where id=?",8900,3)
	check(err)
	fmt.Println(results.RowsAffected()) //更新的条目数

我在这里将id为3的条目的salary列更新为了8900,可以看到更新后的表格:

go语言 流数据分发 go语言操作数据库_go语言 流数据分发_04

5、数据库的删除

删除指的是删除表格中某些条目。

results,err:=db.Exec("DELETE FROM message where id=?",2)
	check(err)
	fmt.Println(results.RowsAffected())  //删除的条目数

将id为2的条目删除,删除后的表格如下:

go语言 流数据分发 go语言操作数据库_sql_05

下面是完整的增删改查代码:

package main

import (
	_"mysql"
	"database/sql"
	"fmt"
)

func check(err error){
	if err!=nil{
		fmt.Println(err)
	}

}


func main(){
	db,err:=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/employee")
	check(err)

	//query
	type info struct {
		id int `db:"id"`
		name string `db:"name"`
		age int `db:"age"`
		sex string `db:"sex"`
		salary int `db:"salary"`
		work string `db:"work"`
		inparty string `db:"inparty"`
	}
	//query
	rows,err:=db.Query("SELECT * FROM message")
	for rows.Next(){
		var s info
		err=rows.Scan(&s.id,&s.name,&s.age,&s.sex,&s.salary,&s.work,&s.inparty)
		check(err)
		fmt.Println(s)
	}
	rows.Close()


	//insert
	db.Exec("INSERT INTO message(id,name,age,sex,salary,work,inparty)VALUES (?,?,?,?,?,?,?)",7,"李白",80,"男",1000,"中","是")

	//update
	results,err:=db.Exec("UPDATE message SET salary=? where id=?",8900,3)
	check(err)
	fmt.Println(results.RowsAffected())


	//delete
	results,err:=db.Exec("DELETE FROM message where id=?",2)
	check(err)
	fmt.Println(results.RowsAffected())
	

}

三、事务

事务是数据库中一个非常重要的概念,我在这里摘抄一段摘要:

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

好了,因为gorm封装了mysql的操作,所以mysql的语句就写这些基础的好了。