侧边栏壁纸
博主头像
Gstory's Blog博主等级

每天进步一点点!

  • 累计撰写 108 篇文章
  • 累计创建 23 个标签
  • 累计收到 11 条评论

目 录CONTENT

文章目录
GO

GO库之sqlx

gstory
2020-01-27 / 0 评论 / 0 点赞 / 105 阅读 / 6708 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-10-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

mysql使用

使用第三方开源的mysql库:
github.com/go-sql-driver/mysql (mysql驱动)
github.com/jmoiron/sqlx (基于mysql驱动的封装)

go get -u github.com/go-sql-driver/mysql 
go get -u github.com/jmoiron/sqlx

连接mysql

func initDB() (err error) {
	dsn := "root:psd@tcp(127.0.0.1:3306)/testdb"
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		fmt.Println("mysql连接失败,", err)
		return
	}
	//最大连接数
	db.SetMaxOpenConns(10)
	//最大空闲连接数
	db.SetMaxIdleConns(10)
	//defer db.Close()
	return
}

create操作

var personTable = `
CREATE TABLE person(
    id bigint(100) NOT NULL AUTO_INCREMENT COMMENT 'id',
    name varchar(100) NULL COMMENT '张三',
    sex varchar(100) NULL COMMENT '男',
    age bigint(11) NULL COMMENT '25',
    PRIMARY KEY (id) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='person';
`

func creatTab() {
	//创建表
	_, err := db.Exec(personTable)
	if err != nil {
		fmt.Println("表创建失败,", err)
		return
	}
}

insert操作

func insert() {
	tx := db.MustBegin()
	//插入数据
	tx.Exec("insert into person (name, sex, age) values (?, ?, ?)", "张三", "男", 19)
	tx.Commit()

	//NameExec()方法
	sqlStr := "insert into person (name, sex, age) values (:name,:sex,:age)"
	_, err := db.NamedExec(sqlStr, map[string]interface{}{
		"name": "李四",
		"sex":  "男",
		"age":  18,
	})
	if err != nil {
		fmt.Printf("插入用户失败,%v\n", err)
	}
}

delete操作

func deleteRow() {
	sqlStr := "delete from person where name = ?"
	ret, err := db.Exec(sqlStr, "张三")
	if err != nil {
		fmt.Printf("删除数据失败,%v\n", err)
	}
	//操作影响的行数
	n, err := ret.RowsAffected()
	if err != nil {
		fmt.Printf("获取影响行数失败,%v\n", err)
		return
	}
	fmt.Printf("删除成功,%v\n", n)
}

update操作

func updateRow() {
	sqlStr := "update person set name=? where id=?"
	ret, err := db.Exec(sqlStr, "王五", 1)
	if err != nil {
		fmt.Printf("更新数据失败,%v\n", err)
		return
	}
	//操作影响的行数
	n, err := ret.RowsAffected()
	if err != nil {
		fmt.Printf("获取影响行数失败,%v\n", err)
		return
	}
	fmt.Printf("更新成功,%v\n", n)
}

select操作

单条查询

func queryRow() {
	var p Person
	sqlStr := "select id,name,sex,age from person where id=?"
	err := db.Get(&p, sqlStr, 1)
	if err != nil {
		fmt.Printf("查询数据失败,%v\n", err)
	}
	fmt.Printf("查询到用户信息 id:%d name:%s sex:%s age:%d", p.ID, p.Name, p.Sex, p.Age)
}

多条查询

func queryListRow() {
	sqlStr := "select id,name,sex,age from person"
	var p []Person
	err := db.Select(&p, sqlStr)
	if err != nil {
		fmt.Printf("查询数据失败,%v\n", err)
	}
	fmt.Printf("查询到的用户列表 %#v\n", p)
}

完整示例

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

var personTable = `
CREATE TABLE person(
    id bigint(100) NOT NULL AUTO_INCREMENT COMMENT 'id',
    name varchar(100) NULL COMMENT '张三',
    sex varchar(100) NULL COMMENT '男',
    age bigint(11) NULL COMMENT '25',
    PRIMARY KEY (id) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='person';
`

type Person struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
	Sex  string `json:"sex"`
	Age  int    `json:"age"`
}

var db *sqlx.DB

func initDB() (err error) {
	dsn := "root:psd@tcp(127.0.0.1:3306)/testdb"
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		fmt.Println("mysql连接失败,", err)
		return
	}
	//最大连接数
	db.SetMaxOpenConns(10)
	//最大空闲连接数
	db.SetMaxIdleConns(10)
	//defer db.Close()
	return
}

func main() {
	//连接mysql数据库
	initDB()
	//创建表
	//creatTab()
	//插入数据
	insert()
	//更新数据
	updateRow()
	//查询单条数据
	queryRow()
	//查询多条数据
	queryListRow()
	//删除数据
	deleteRow()
}

func creatTab() {
	//创建表
	_, err := db.Exec(personTable)
	if err != nil {
		fmt.Println("表创建失败,", err)
		return
	}
}

func insert() {
	tx := db.MustBegin()
	//插入数据
	tx.Exec("insert into person (name, sex, age) values (?, ?, ?)", "张三", "男", 19)
	tx.Commit()

	//NameExec()方法
	sqlStr := "insert into person (name, sex, age) values (:name,:sex,:age)"
	_, err := db.NamedExec(sqlStr, map[string]interface{}{
		"name": "李四",
		"sex":  "男",
		"age":  18,
	})
	if err != nil {
		fmt.Printf("插入用户失败,%v\n", err)
	}
}

func queryRow() {
	var p Person
	sqlStr := "select id,name,sex,age from person where id=?"
	err := db.Get(&p, sqlStr, 1)
	if err != nil {
		fmt.Printf("查询数据失败,%v\n", err)
	}
	fmt.Printf("查询到用户信息 id:%d name:%s sex:%s age:%d", p.ID, p.Name, p.Sex, p.Age)

}

func queryListRow() {
	sqlStr := "select id,name,sex,age from person"
	var p []Person
	err := db.Select(&p, sqlStr)
	if err != nil {
		fmt.Printf("查询数据失败,%v\n", err)
	}
	fmt.Printf("查询到的用户列表 %#v\n", p)
}

func updateRow() {
	sqlStr := "update person set name=? where id=?"
	ret, err := db.Exec(sqlStr, "王五", 1)
	if err != nil {
		fmt.Printf("更新数据失败,%v\n", err)
		return
	}
	//操作影响的行数
	n, err := ret.RowsAffected()
	if err != nil {
		fmt.Printf("获取影响行数失败,%v\n", err)
		return
	}
	fmt.Printf("更新成功,%v\n", n)
}

func deleteRow() {
	sqlStr := "delete from person where name = ?"
	ret, err := db.Exec(sqlStr, "张三")
	if err != nil {
		fmt.Printf("删除数据失败,%v\n", err)
	}
	//操作影响的行数
	n, err := ret.RowsAffected()
	if err != nil {
		fmt.Printf("获取影响行数失败,%v\n", err)
		return
	}
	fmt.Printf("删除成功,%v\n", n)
}
0

评论区