标题
// sql.Open 返回二个值:1.数据操作 2.语法正确与否
// db.QueryRow 查找一条数据
// scan 可以返回一个错误信息
// rows.Next() bool类型 查到信息返回true 配合for使用
文章目录
1.连接数据库 sql.Open()
1.下载
go get -u github.com/go-sql-driver/mysql
2.全部代码
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql" //导入
)
func main() {
dsn := "账号:密码@tcp(ip:3306)/库名称"
db, err := sql.Open("mysql", dsn) // 查看dsn语法有没有问题
if err != nil {
fmt.Println(db, err)
return
}
errs := db.Ping() //db.Ping() 尝试连接 :成功 errs显示nil
fmt.Println(errs)
}
func initdb() (err error) {
db, err = sql.Open("mysql", "admin:admin@tcp(43.138.57.471:3306)/test") //给db全局空指针 传连接成功的值
errs := db.Ping()
return errs
}
2.查询单条语句 db.QueryRow()
type user struct {
name string
age int
sex string
}
func queryOne(name int) {
var u1 user //结构体对象
//第一种写法 1.搜索出来 2.利用scan !nil 扫描传值 并关闭
// data := db.QueryRow("select name,age from feixiang where name = 1")
// data.Scan(&u1.name, &u1.age) // &:指针 没有&指针 改不了u1 原始值 改的是临时u1
// fmt.Println(u1)
//第二种写法 1.搜索出来 直接利用scan赋值 并返回连接池
sqlStr := `select name,age,sex from feixiang where name = ?`
// &:指针 没有&指针 改不了u1 原始值 改的是临时u1
db.QueryRow(sqlStr, name).Scan(&u1.name, &u1.age, &u1.sex)
fmt.Printf("u1:%#v", u1) //加#号 可以打印出来 对象
}
2.1 查询多条 db.query 他的scan没有关闭连接池功能
//查询多条 db.query
func queryMore(name int) {
sqlStr := `select name,IFNULL(age, 0),IFNULL(sex, 0) from feixiang where name > ?`
rows, err := db.Query(sqlStr, name)
// 记得用完关闭连接池
defer rows.Close()
//如果有错 就打印出错误
if err != nil {
fmt.Println("查询多条 出错:%v", err)
return
}
// rows.Next() 一条 一条 来
//循环取值赋值
for rows.Next() {
var u1 user
// scan 赋值
err := rows.Scan(&u1.name, &u1.age, &u1.sex)
//如果有错 就打印出错误
if err != nil {
fmt.Println("循环取值报错", err)
}
fmt.Println(u1)
}
}
----------------------------------------示例代码:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
type user struct {
name string
age int
sex string
}
func initDB() (err error) {
//连接数据库
db, err = sql.Open("mysql", "admin:admin@tcp(43.138.57.XX:3306)/test")
//判断语法错误
if err != nil {
fmt.Println("数据库语法错误")
return
}
// 判断连接成功与否
errs := db.Ping()
if errs == nil {
fmt.Println("连接成功")
}
return
}
// 查询一条数据
func selectOne() {
sqlStr := `select * from feixiang`
var u1 user
//扫描赋值并且关闭
db.QueryRow(sqlStr).Scan(&u1.name, &u1.age, &u1.sex)
fmt.Println(u1)
}
func selectMore() {
sqlStr := `select * from feixiang`
var u1 user
//扫描赋值并且关闭
rows, err := db.Query(sqlStr)
defer rows.Close()
//如果有错 就打印出错误
if err != nil {
fmt.Println("查询多条 出错:%v", err)
return
}
for rows.Next() {
rows.Scan(&u1.name, &u1.age, &u1.sex)
fmt.Println(u1)
}
}
func main() {
initDB()
selectMore()
selectOne()
}
三, 插入,更新,删除 使用的是一个方法 db.Exec()
1.res.LastInsertId() // 插入使用 插入几条
2.res.RowsAffected() // 更新删除使用 操作影响的行数
插入
func insert (){
sqlStr := `insert into feixiang (name,age,sex) values ('1','2','3')`
db.exec(sqlStr)
}
删除
func insert (){
sqlStr := `delete from feixiang where id = 6`
db.exec(sqlStr)
}
更改
func insert (){
sqlStr := `update feixiang set name = 1 where id = 10`
db.exec(sqlStr)
}
------------- 插入,更新,删除 实例:
func insert() {
sqlStr := `insert into feixiang(name,age,sex) values('a','1001','c')`
res, err := db.Exec(sqlStr)
if err != nil {
fmt.Println("插入失败")
} else {
res, err := res.LastInsertId()
fmt.Println(res)
fmt.Println(err)
}