这里来做一个数据库操作,使用的数据库是mysql数据库,版本5.7,开发环境win10,开发工具liteIDE x35.1
这里先来说一下使用的两个外部包
github.com/Unknwon/goconfig:用来读取.ini文件
github.com/go-sql-driver/mysql:数据库补充包
首先引入外部引用包,这里由于是自学新手,刚开始一直引入不了,研究了好久才搞定,所以将步骤详细的记录了下来。
1、配置环境变量GOPATH,值是什么呢,值就是我们自己的工作空间,编译-->编译配置,可以看到我们自己的GOPATH
只有 在环境变量中配置了这个才可以安装,不知道有没有其它的方式
2、安装外部包
在dos中输入命令命令,等待安装完成
go get github.com/go-sql-driver/mysql
go get github.com/Unknwon/goconfig
到这里外部包的安装就完成了,下面直接看代码:
建表语句:
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`no` varchar(45) COLLATE utf8_bin NOT NULL,
`name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
代码:
// demo project main.go
package main
import (
"database/sql"
"log"
"strings"
goconfig "github.com/Unknwon/goconfig"
_ "github.com/go-sql-driver/mysql"
)
//定义一个和表对应的结构体
type Student struct {
id int
no string //学号
name string //姓名
score uint //成绩
}
//读取数据库配置文件
func readDatabaseConf() (string, error) {
cfg, err := goconfig.LoadConfigFile("database.ini") //加载配置文件
if err != nil {
return "", err
}
//读取数据
userName, _ := cfg.GetValue("mysql", "userName")
password, _ := cfg.GetValue("mysql", "password")
host, _ := cfg.GetValue("mysql", "host")
port, _ := cfg.GetValue("mysql", "port")
schema, _ := cfg.GetValue("mysql", "schema")
//将数据转换成数据库url作为返回值
url := strings.Join([]string{userName, ":", password, "@tcp(", host, ":", port, ")/", schema}, "")
return url, nil
}
//初始化数据库连接
func InitDatabase() (*sql.DB, error) {
url, err := readDatabaseConf()
if err != nil {
log.Printf("init database error:%v", err)
return nil, err
}
db, err := sql.Open("mysql", url)
if err != nil {
log.Printf("open database error:%v", err)
return nil, err
}
return db, nil
}
//执行增、改、删任务
func Execute(db *sql.DB, sql string, params ...interface{}) error {
stmt, _ := db.Prepare(sql) //预编译
defer stmt.Close()
_, err := stmt.Exec(params...)
if err != nil {
log.Printf("execute sql error:%v\n", err)
return err
}
log.Println("execute sql success")
return nil
}
//查询数据库数据
func QueryData(db *sql.DB, sql string, params ...interface{}) (*sql.Rows, error) {
stmt, _ := db.Prepare(sql)
defer stmt.Close()
rows, err := stmt.Query(params...)
if err != nil {
log.Printf("query data error:%v", err)
return nil, err
}
log.Println("query data success")
return rows, nil
}
func main() {
db, err := InitDatabase()
defer db.Close()
if err != nil {
log.Println(err)
return
}
//增
insertSql := "insert into student(no, name, score) values(?, ?, ?)"
err = Execute(db, insertSql, "123456", "Jack", 95)
if err != nil {
log.Printf("insert data error : %v\n", err)
return
}
//查
querySql := "select id, no, name, score from student where name = ?"
rows, err := QueryData(db, querySql, "Jack")
defer rows.Close()
if err != nil {
log.Printf("query data error:%v\n", err)
return
}
s := new(Student)
for rows.Next() {
rows.Scan(&s.id, &s.no, &s.name, &s.score)
log.Println(*s)
}
//改
updateSql := "update student set name = ? where no = ?"
Execute(db, updateSql, "Rose", "123456")
//删
//deleteSql := "delete from student"
//Execute(db, deleteSql)
}
代码也没有什么好说的,就是注意用完的连接记得要关闭