1 package main 2 3 import ( 4 "database/sql" 5 "fmt" 6 _ "github.com/go-sql-driver/mysql" 7 ) 8 9 // 定义一个全局对象db 10 var db *sql.DB 11 //定义结构体 12 type User struct { 13 Id int 14 Name string 15 Age int 16 } 17 18 //初始化数据库 19 func InitDB() (err error) { 20 //连接数据库 21 dsn := "root:root@tcp(127.0.0.1:3306)/db3" 22 db, err = sql.Open("mysql", dsn) 23 //错误处理 24 if err != nil { 25 return err 26 } 27 //检验dsn是否正确 28 err = db.Ping() 29 if err != nil { 30 return err 31 } 32 return nil 33 } 34 35 //数据库单行查询 36 func queryRowDemo() { 37 //创建User对象 38 var u User 39 //sql语句 40 sqlStr := "select * from user where id=?" 41 //调用QueryRow方法返回查询的一行,后边调用的scan方法是将查询出来的行放入指定的参数中 42 err := db.QueryRow(sqlStr, 1).Scan(&u.Id, &u.Name, &u.Age) 43 if err != nil { 44 fmt.Println(err) 45 return 46 } 47 fmt.Println(u.Id, u.Name, u.Age) 48 } 49 50 //查询多行 51 /* 52 查询多行和查询单行的不同之处是调用方法query并返回多行 53 然后通过for循环调用scan方法吧每一行循环遍历出来 54 */ 55 func queryDemo() { 56 //sql语句 57 sqlStr := "select * from user" 58 //调用方法 59 rows, err := db.Query(sqlStr) 60 //错误处理 61 if err != nil { 62 fmt.Println(err) 63 } 64 //关闭rows释放持有的数据库链接 65 defer rows.Close() 66 //使用for循环进行结果的读取 67 for rows.Next() { 68 var u User 69 err := rows.Scan(&u.Id, &u.Name, &u.Age) 70 if err != nil { 71 fmt.Println(err) 72 } 73 fmt.Printf("id:%d name:%s age:%d\n", u.Id, u.Name, u.Age) 74 } 75 } 76 77 //插入数据 78 func InsertDemo() { 79 //sql语句 80 sqlStr := "insert into user(name,age) value(?,?)" 81 //Exec执行一次命令(包括查询、删除、更新、插入等),返回的Result是对已执行的SQL命令的总结。参数args表示query中的占位参数 82 ret, err := db.Exec(sqlStr, "赵六", 30) 83 if err != nil { 84 fmt.Println(err) 85 return 86 } 87 fmt.Println(ret) 88 // 新插入数据的id是theID 89 theID, err := ret.LastInsertId() 90 if err != nil { 91 fmt.Printf("get lastinsert ID failed, err:%v\n", err) 92 return 93 } 94 fmt.Printf("insert success, the id is %d.\n", theID) 95 } 96 97 //更新数据 98 func UpdateDemo() { 99 sqlStr := "update user set age=? where id =?" 100 ret, err := db.Exec(sqlStr, 39, 3) 101 if err != nil { 102 fmt.Printf("update failed, err:%v\n", err) 103 return 104 } 105 n, err := ret.RowsAffected() // 操作影响的行数 106 if err != nil { 107 fmt.Printf("get RowsAffected failed, err:%v\n", err) 108 return 109 } 110 fmt.Printf("update success, affected rows:%d\n", n) 111 } 112 113 //删除数据 114 func DeleteDemo() { 115 sqlStr := "delete from user where id=?" 116 ret, err := db.Exec(sqlStr, 4) 117 if err != nil { 118 fmt.Println(err) 119 return 120 } 121 n, err := ret.RowsAffected() 122 if err != nil { 123 fmt.Printf("get RowsAffected failed, err:%v\n", err) 124 return 125 } 126 fmt.Printf("delete success, affected rows:%d\n", n) 127 128 } 129 func main() { 130 //调用初始化函数 131 err := InitDB() 132 if err != nil { 133 fmt.Println(err) 134 } 135 //调用函数 136 //queryRowDemo() 137 //queryDemo() 138 //InsertDemo() 139 //UpdateDemo() 140 //DeleteDemo() 141 }
原文:https://www.cnblogs.com/yh2924/p/12395941.html