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.DBfunc 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 Userif 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)}
