青训营第3节GO语言SQL链接| 青训营

67 阅读5分钟

一、重点内容: 知识要点有哪些? 1、理解database/SQL 2、数据库表数据的CRUD 二、详细知识点介绍: 1、数据库导入 下载导入数据库驱动: go get github.com/go-sql-driver/mysql 1

创建数据库表: 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; 1 2 3 4 5 6 7 创建数据库连接: db, err := sql.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis") if err != nil { log.Fatal(err) } defer rows.Close() 1 2 3 4 5 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) } } 1 2 3 4 5 6 7 8 9 10 11 12 13 查询数据: 方便查询我们先建立一个实体结构体:

type user struct { id int username string age int score int } 1 2 3 4 5 6 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() }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 测试:

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() }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 测试:

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() }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 测试:

插入数据: /* 插入新的数据,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) } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 更新数据: / 更新数据 / 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) } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 删除数据: / 根据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) } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 3、数据库设计原理

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) } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 三、课后个人总结: ​ 这次比较深入地去了解学习了go中数据库的操作,收获颇多。也开始了GORM库的学习,下一篇文章记录GORM的使用。