database/sql 包提供了对数据库的通用接口,在使用具体数据库式需要选择对应的数据库驱动

使用流程

创建库和表

  1. MariaDB> create database htgolang default charset utf8mb4;
  2. # 创建表
  3. MariaDB> create table user(
  4. -> id integer primary key auto_increment,
  5. -> name varchar(32) not null default '',
  6. -> password varchar(512) not null default '',
  7. -> )engine=innodb default charset utf8mb4;

下载数据库驱动

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

初始化导入数据库驱动

  1. import (
  2. "database/sql"
  3. _ "github.com/go-sql-driver/mysql"

创建连接(连接池)

  1. // 定义数据库连接池指针
  2. var DB *sql.DB
  3. func init(){
  4. // 打开数据库连接池
  5. DB, _ = sql.Open("mysql", "root:111111@tcp(localhost:3306)/htgolang?charset=utf8mb4")
  6. // 测试数据库连接
  7. if err := DB.Ping(); err != nil {
  8. fmt.Println(err)
  9. os.Exit(-1)
  10. }
  11. }

执行查询/更新操作

  1. // 查询数据结构体
  2. rows, err := DB.Query("select id, name, password, gender, birthday, addr from user limit 0 ")
  3. if err == nil {
  4. defer rows.Close()
  5. // 列名
  6. fmt.Println(rows.Columns())
  7. // 列信息
  8. types, _ := rows.ColumnTypes()
  9. for _, typ := range types {
  10. fmt.Println(typ.Name(), typ.DatabaseTypeName(), typ.ScanType())
  11. }
  12. } else {
  13. fmt.Println(err)
  14. }

插入数据

  1. for i:=0; i<10;i++ {
  2. result, err := DB.Exec("insert into user(name, password, gender,birthday, addr) values(?.md5(?), ?, ?, ?)", fmt.Sprintf("ligz_%d", i), "123456", true, "1999-10-10", "北京市"_)
  3. if err == nil {
  4. // 获取插入数据主键
  5. fmt.Println(result.LastInstertId())
  6. // 获取影响行数
  7. fmt.Println(result.RowsAffected())
  8. } else {
  9. fmt.Println(err)
  10. }
  11. }

更新数据

  1. result, err := DB.Exec("update user set password=md5(?) where id=?"), "123456", 1)
  2. if err == nil {
  3. // 获取影响行数
  4. fmt.Println(result.RowAffected())
  5. } else {
  6. fmt.Println(err)
  7. }

删除数据

  1. result, err = DB.Exec("delete from user where id=?", 5)
  2. if err == nil {
  3. // 获取影响行数
  4. fmt.Println(result.RowsAffected())
  5. } else {
  6. fmt.Println(err)
  7. }

查询数据

  1. rows, err := DB.Query("select id, name, password,gender,birthday, addr from user")
  2. if err == nil {
  3. defer rows.CLose()
  4. for rows.Next() {
  5. var user User
  6. if err := rows.Scan(&user.id, &user.name, &user.password, &user.gender, &user.birthday, &user.addr); err == nil {
  7. fmt.Println(user)
  8. } else {
  9. fmt.Println(err)
  10. }
  11. }
  12. } else {
  13. fmt.Println(err)
  14. }