Go语言原生数据库操作(六)—— 数据库

一、重点内容:

知识要点有哪些?

1、理解database/SQL

2、数据库表数据的CRUD

二、详细知识点介绍:

1、数据库导入

下载导入数据库驱动:

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

image-20230209210231857

创建数据库表:

CREATE TABLE `user` (
   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
   `username` VARCHAR(20) DEFAULT '',
   `age` INT(11) DEFAULT '0',
   `score` int default 0
   PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

创建数据库连接:

db, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
if err != nil {
    
    
   log.Fatal(err)
}
defer rows.Close()

2、数据库的CRUD:

初始化:

/*
*
初始化
*/
var db *sql.DB

func init() {
    
    
   db1, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
   db = db1
   if err != nil {
    
    
      log.Fatal(err)
   }
}

查询数据:

方便查询我们先建立一个实体结构体:

type user struct {
    
    
   id       int
   username string
   age      int
   score    int
}
1、多行查询:
//go:build ignore
// +build ignore

package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "log"
)

type user struct {
    
    
   id       int
   username string
   age      int
   score    int
}

var db *sql.DB

func main() {
    
    
   db1, err := sql.Open("mysql", "root:XXXX@tcp(127.0.0.1:3306)/mybatis")
   db = db1
   if err != nil {
    
    
      log.Fatal(err)
   }
   rows, err := db.Query("select * from user ")
   if err != nil {
    
    
      log.Fatal(err)
   }
   for rows.Next() {
    
    
      var user1 user
      rows.Scan(&user1.id, &user1.username, &user1.age, &user1.score)
      fmt.Println(user1.id, user1.username, user1.age, user1.score)
   }
   defer rows.Close()
}

测试:

image-20230210190155907

2、单行查询:
//go:build ignore
// +build ignore

package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "log"
)

type user struct {
    
    
   id       int
   username string
   age      int
   score    int
}

var db *sql.DB

func main() {
    
    
   db1, err := sql.Open("mysql", "root:XXXXX@tcp(127.0.0.1:3306)/mybatis")
   db = db1
   sqlStr := "select * from user where id=?"
	var u user
	// 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
	err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.username, &u.age, &u.score)
	if err != nil {
    
    
		fmt.Printf("scan failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d name:%s age:%d\n", u.id, u.username, u.age)
   defer rows.Close()
}

测试:

image-20230210190444929

3、预编译查询
//go:build ignore
// +build ignore

package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "log"
)

type user struct {
    
    
   id       int
   username string
   age      int
   score    int
}

func main() {
    
    
   open, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
   if err != nil {
    
    
      log.Fatal(err)
   }
   sqlStr := "select * from user where id>?"
   prepare, err := open.Prepare(sqlStr)
   if err != nil {
    
    
      log.Fatal(err)
   }
   query, err := prepare.Query(1)
   for query.Next() {
    
    
      var u user
      query.Scan(&u.id, &u.username, &u.age, &u.score)
      fmt.Println(u.id, u.username, u.age, u.score)
   }
   query.Close()
   open.Close()
}

测试:

image-20230210191520366

插入数据:

/*
插入新的数据,ID自增
*/
func insertRow(name string, age int, score int) {
    
    
   sqlStr := "insert into user(username,age,score) values (?,?,?)"
   exec, err := db.Exec(sqlStr, name, age, score)
   if err != nil {
    
    
      log.Fatal(err)
   }
   id, err := exec.LastInsertId()
   if err != nil {
    
    
      log.Fatal(err)
   }
   fmt.Println(id)
}

更新数据:

/*
更新数据
*/
func updateRow(id int, score int) {
    
    
   sqlStr := "update user set score=? where id=?"
   exec, err := db.Exec(sqlStr, score, id)
   if err != nil {
    
    
      log.Fatal(err)
   }
   affected, err := exec.RowsAffected()
   if err != nil {
    
    
      log.Fatal(err)
   }
   fmt.Println("影响行数:", affected)
}

删除数据:

/*
根据ID删除数据
*/
func deleteRow(id int) {
    
    
   sqlStr := "delete from user where id =?"
   exec, err := db.Exec(sqlStr, id)
   if err != nil {
    
    
      log.Fatal(err)
   }
   affected, err := exec.RowsAffected()
   if err != nil {
    
    
      log.Fatal(err)
   }
   fmt.Println("影响行数:", affected)
}

3、数据库设计原理

image-20230210185739393

4、完整代码:

//go:build ignore
// +build ignore

package main

import (
   "database/sql"
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "log"
)

type user struct {
    
    
   id       int
   username string
   age      int
   score    int
}

func main() {
    
    
   fmt.Println("查询所有记录")
   queryAll()
   fmt.Println("根据ID查询")
   queryRowDemo(1)
   fmt.Println("插入新的数据")
   insertRow("罗某", 21, 78)
   fmt.Println("查询分数大于多少的数据")
   queryByScore(96)
   fmt.Println("更新数据")
   updateRow(3, 50)
   fmt.Println("删除数据")
   deleteRow(6)
}

/*
*
初始化
*/
var db *sql.DB

func init() {
    
    
   db1, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis")
   db = db1
   if err != nil {
    
    
      log.Fatal(err)
   }
}

/*
查询所有记录
*/
func queryAll() {
    
    
   rows, err := db.Query("select * from user ")
   if err != nil {
    
    
      log.Fatal(err)
   }
   for rows.Next() {
    
    
      var user1 user
      rows.Scan(&user1.id, &user1.username, &user1.age, &user1.score)
      fmt.Println(user1.id, user1.username, user1.age, user1.score)
   }
   defer rows.Close()
}

/*
根据ID查询
*/
func queryRowDemo(id int) {
    
    
   sqlStr := "select * from user where id=?"
   var u user
   // 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
   err := db.QueryRow(sqlStr, id).Scan(&u.id, &u.username, &u.age, &u.score)
   if err != nil {
    
    
      fmt.Printf("scan failed, err:%v\n", err)
      return
   }
   fmt.Printf("id:%d name:%s age:%d\n", u.id, u.username, u.age)
}

/*
条件查询,分数大于多少的数据
*/
func queryByScore(score int) {
    
    
   sqlStr := "select * from user where score>?"
   prepare, err := db.Prepare(sqlStr)
   if err != nil {
    
    
      log.Fatal(err)
   }
   query, err := prepare.Query(score)
   for query.Next() {
    
    
      var u user
      query.Scan(&u.id, &u.username, &u.age, &u.score)
      fmt.Printf("id:%d  name:%s age:%d score:%d\n", u.id, u.username, u.age, u.score)
   }
}

/*
插入新的数据,ID自增
*/
func insertRow(name string, age int, score int) {
    
    
   sqlStr := "insert into user(username,age,score) values (?,?,?)"
   exec, err := db.Exec(sqlStr, name, age, score)
   if err != nil {
    
    
      log.Fatal(err)
   }
   id, err := exec.LastInsertId()
   if err != nil {
    
    
      log.Fatal(err)
   }
   fmt.Println(id)
}

/*
更新数据
*/
func updateRow(id int, score int) {
    
    
   sqlStr := "update user set score=? where id=?"
   exec, err := db.Exec(sqlStr, score, id)
   if err != nil {
    
    
      log.Fatal(err)
   }
   affected, err := exec.RowsAffected()
   if err != nil {
    
    
      log.Fatal(err)
   }
   fmt.Println("影响行数:", affected)
}

/*
根据ID删除数据
*/
func deleteRow(id int) {
    
    
   sqlStr := "delete from user where id =?"
   exec, err := db.Exec(sqlStr, id)
   if err != nil {
    
    
      log.Fatal(err)
   }
   affected, err := exec.RowsAffected()
   if err != nil {
    
    
      log.Fatal(err)
   }
   fmt.Println("影响行数:", affected)
}

三、课后个人总结:

​ 这次比较深入地去了解学习了go中数据库的操作,收获颇多。也开始了GORM库的学习,下一篇文章记录GORM的使用。

猜你喜欢

转载自blog.csdn.net/qq_54353206/article/details/128978180