database/sql 包提供了对数据库的通用接口,在使用具体数据库式需要选择对应的数据库驱动
使用流程
创建库和表
MariaDB> create database htgolang default charset utf8mb4;
# 创建表
MariaDB> create table user(
-> id integer primary key auto_increment,
-> name varchar(32) not null default '',
-> password varchar(512) not null default '',
-> )engine=innodb default charset utf8mb4;
下载数据库驱动
go get -u github.com/go-sql-driver/mysql
初始化导入数据库驱动
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
创建连接(连接池)
// 定义数据库连接池指针
var DB *sql.DB
func init(){
// 打开数据库连接池
DB, _ = sql.Open("mysql", "root:111111@tcp(localhost:3306)/htgolang?charset=utf8mb4")
// 测试数据库连接
if err := DB.Ping(); err != nil {
fmt.Println(err)
os.Exit(-1)
}
}
执行查询/更新操作
// 查询数据结构体
rows, err := DB.Query("select id, name, password, gender, birthday, addr from user limit 0 ")
if err == nil {
defer rows.Close()
// 列名
fmt.Println(rows.Columns())
// 列信息
types, _ := rows.ColumnTypes()
for _, typ := range types {
fmt.Println(typ.Name(), typ.DatabaseTypeName(), typ.ScanType())
}
} else {
fmt.Println(err)
}
插入数据
for i:=0; i<10;i++ {
result, err := DB.Exec("insert into user(name, password, gender,birthday, addr) values(?.md5(?), ?, ?, ?)", fmt.Sprintf("ligz_%d", i), "123456", true, "1999-10-10", "北京市"_)
if err == nil {
// 获取插入数据主键
fmt.Println(result.LastInstertId())
// 获取影响行数
fmt.Println(result.RowsAffected())
} else {
fmt.Println(err)
}
}
更新数据
result, err := DB.Exec("update user set password=md5(?) where id=?"), "123456", 1)
if err == nil {
// 获取影响行数
fmt.Println(result.RowAffected())
} else {
fmt.Println(err)
}
删除数据
result, err = DB.Exec("delete from user where id=?", 5)
if err == nil {
// 获取影响行数
fmt.Println(result.RowsAffected())
} else {
fmt.Println(err)
}
查询数据
rows, err := DB.Query("select id, name, password,gender,birthday, addr from user")
if err == nil {
defer rows.CLose()
for rows.Next() {
var user User
if err := rows.Scan(&user.id, &user.name, &user.password, &user.gender, &user.birthday, &user.addr); err == nil {
fmt.Println(user)
} else {
fmt.Println(err)
}
}
} else {
fmt.Println(err)
}