数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。
这里不对数据库的知识做过多介绍,想要对数据库有更深的了解可以点这里,我在这里只介绍下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()
可以看到表格中的内容如下:
如果需要按条件查询的话,可以使用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)
}
可以看到只输出了符合查询条件的结果的部分列。
3、数据库增加条目
result,err:=db.Exec("INSERT INTO message(id,name,age,sex,salary,work,inparty)VALUES (?,?,?,?,?,?,?)",7,"李白",80,"男",1000,"中","是")
check(err)
这里增加了一个条目,这个时候再查询就可以看到表中增加了一条,正是我们插入的那条数据。
4、数据库的更新
results,err:=db.Exec("UPDATE message SET salary=? where id=?",8900,3)
check(err)
fmt.Println(results.RowsAffected()) //更新的条目数
我在这里将id为3的条目的salary列更新为了8900,可以看到更新后的表格:
5、数据库的删除
删除指的是删除表格中某些条目。
results,err:=db.Exec("DELETE FROM message where id=?",2)
check(err)
fmt.Println(results.RowsAffected()) //删除的条目数
将id为2的条目删除,删除后的表格如下:
下面是完整的增删改查代码:
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的语句就写这些基础的好了。