go mysql

标题

// 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)

	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值