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)
}
评论区