package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
/*
建库建表
CREATE DATABASE sql_test;
use sql_test;
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT '',
`age` INT(11) DEFAULT '0',
PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
*/
// 定义一个全局对象db
var db *sql.DB
// 为了方便查询,我们事先定义好一个结构体来存储user表的数据。
type user struct {
id int
age int
name string
}
// 定义一个初始化数据库的函数
func initDB() (err error) {
// DSN:Data Source Name
dsn := "root:123@tcp(172.16.90.236:3306)/sql_test?charset=utf8mb4&parseTime=True"
// 不会校验账号密码是否正确
// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
db, err = sql.Open("mysql", dsn)
if err != nil {
return err
}
// 尝试与数据库建立连接(校验dsn是否正确)
err = db.Ping()
if err != nil {
return err
}
return nil
}
// 插入数据
func insertRowDemo(name string, age int) {
sqlStr := "insert into user(name,age) value(?,?)"
ret, err := db.Exec(sqlStr, name, age)
if err != nil {
fmt.Printf("insert failed,err:%v\n", err)
return
}
// 新插入数据的id
theID, err := ret.LastInsertId()
if err != nil {
fmt.Printf("get lastinsert ID failed,err:%v\n", err)
return
}
fmt.Printf("insert success, the id is %d.\n", theID)
}
// 查询单条数据示例
func queryRowDemo() {
sqlStr := "select id,name,age from user where id=?"
var u user
// 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}
// 查询多条数据示例
func queryMultiRowDemo() {
sqlStr := "select id,name,age from user where id>?"
rows, err := db.Query(sqlStr, 0)
if err != nil {
fmt.Printf("query failed,err:%v\n", err)
return
}
// 非常重要,关闭rows释放持有的数据库连接
defer rows.Close()
// 循环读取结果集中的数据
for rows.Next() {
var u user
err := rows.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("scan failed,err:%v\n", err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}
}
// 更新数据
func updateRowDemo(age, id int) {
sqlStr := "update user set age=? where id=?"
ret, err := db.Exec(sqlStr, age, id)
if err != nil {
fmt.Printf("update failed, err:%v\n", err)
return
}
// 操作影响的行数
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("get RowsAffected failed,err:%v\n", err)
return
}
fmt.Printf("update success,affected rows:%d\n", n)
}
// 删除数据
func deleteRowDemo(id int) {
sqlStr := "delete from user where id=?"
ret, err := db.Exec(sqlStr, id)
if err != nil {
fmt.Printf("delete failed,err:%v\n", err)
return
}
// 操作影响的行数
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("get RowAffected failed,err:%v\n", err)
return
}
fmt.Printf("delete success, affected rows:%d\n", n)
}
func main() {
// 调用输出化数据库的函数
err := initDB()
if err != nil {
fmt.Printf("init db failed,err:%v\n", err)
return
}
// insertRowDemo("王五", 38)
// insertRowDemo("张一", 18)
// insertRowDemo("李三", 38)
// insertRowDemo("找四", 48)
// insertRowDemo("二哈", 28)
// queryRowDemo()
queryMultiRowDemo()
// updateRowDemo(66, 2)
// deleteRowDemo(2)
}