共计 4278 个字符,预计需要花费 11 分钟才能阅读完成。
环境筹备
# MySQL 筹备工作
$ sudo service mysql start
* Starting MySQL database server mysqld
...done.
$ mysql -uroot -e "create database test;"
$ mysql -uroot
MariaDB [test]> CREATE TABLE `person` (-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `name` varchar(260) DEFAULT NULL,
-> `age` int(28) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.014 sec)
# 导包
$ go get github.com/go-sql-driver/mysql
$ go get github.com/jmoiron/sqlx
连贯数据库
$ mkdir mysql-demo && cd mysql-demo && go mod init mysql-demo
$ vi main.go
// main.go
package main
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
func main(){db, err := sqlx.Open("mysql", "root:@tcp(localhost:3306)/test")
if err != nil{panic(err)
}
defer db.Close()
fmt.Println("connect to MySQL success...")
}
$ go run main.go
connect to MySQL success...
Insert 操作
// main.go
package main
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
var (Db *sqlx.DB)
func init(){db, err := sqlx.Open("mysql", "root:@tcp(localhost:3306)/test")
if err != nil{fmt.Println("connect to MySQL failed...")
panic(err)
}
// defer db.Close()
Db = db
fmt.Println("connect to MySQL success...")
}
func main(){defer Db.Close()
r, err := Db.Exec("insert into person(name, age)values(?,?)","xiaoming","18")
if err!=nil{fmt.Println("exec failed,", err)
panic(err)
}
id, err := r.LastInsertId()
if err != nil {fmt.Println("exec failed,", err)
return
}
fmt.Println("insert succ:", id)
}
$ go run main.go
connect to MySQL success...
insert succ: 1
Select 操作
// main.go
package main
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
var (Db *sqlx.DB)
type Person struct {
Id int `db:"id"`
Name string `db:"name"`
Age string `db:"age"`
}
func init(){db, err := sqlx.Open("mysql", "root:@tcp(localhost:3306)/test")
if err != nil{fmt.Println("connect to MySQL failed...")
panic(err)
}
// defer db.Close()
Db = db
fmt.Println("connect to MySQL success...")
}
func main(){defer Db.Close()
var p []Person
err := Db.Select(&p, "select id,name,age from person where id = ?", 1)
if err!=nil{fmt.Println("exec failed,", err)
panic(err)
}
fmt.Println("select succ:", p)
}
$ go run main.go
connect to MySQL success...
select succ: [{1 xiaoming 18}]
Update 操作
package main
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
var (Db *sqlx.DB)
func init(){db, err := sqlx.Open("mysql", "root:@tcp(localhost:3306)/test")
if err != nil{fmt.Println("connect to MySQL failed...")
panic(err)
}
// defer db.Close()
Db = db
fmt.Println("connect to MySQL success...")
}
func main(){defer Db.Close()
res, err := Db.Exec("update person set name=? where id=?", "xiaobai", 1)
if err != nil {fmt.Println("exec failed,", err)
return
}
row, err := res.RowsAffected()
if err != nil {fmt.Println("rows failed,",err)
}
fmt.Println("update succ:",row)
}
$ go run main.go
connect to MySQL success...
update succ: 1
Delete 操作
package main
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
var (Db *sqlx.DB)
func init(){db, err := sqlx.Open("mysql", "root:@tcp(localhost:3306)/test")
if err != nil{fmt.Println("connect to MySQL failed...")
panic(err)
}
// defer db.Close()
Db = db
fmt.Println("connect to MySQL success...")
}
func main(){defer Db.Close()
res, err := Db.Exec("delete from person where id=?", 1)
if err != nil {fmt.Println("exec failed,", err)
return
}
row, err := res.RowsAffected()
if err != nil {fmt.Println("rows failed,",err)
}
fmt.Println("delete succ:",row)
}
$ go run main.go
connect to MySQL success...
delete succ: 1
MySQL 事务
事务具备四个个性 (ACID):原子性 一致性 隔离性 持久性
开启事务 Db.Begin()
提交事务 Db.Commit()
回滚事务 Db.Rollback()
package main
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
var (Db *sqlx.DB)
func init(){db, err := sqlx.Open("mysql", "root:@tcp(localhost:3306)/test")
if err != nil{fmt.Println("connect to MySQL failed...")
panic(err)
}
// defer db.Close()
Db = db
fmt.Println("connect to MySQL success...")
}
func main(){defer Db.Close()
// begin transaction
conn, err := Db.Begin()
if err != nil {fmt.Println("begin failed :", err)
return
}
r, err := conn.Exec("insert into person(name, age)values(?, ?)", "xiaoming", 18)
if err != nil {fmt.Println("exec failed,", err)
conn.Rollback() // rollback transaction
return
}
id, err := r.LastInsertId()
if err != nil {fmt.Println("exec failed,", err)
conn.Rollback() // rollback transaction
return
}
fmt.Println("insert succ:", id)
r, err = conn.Exec("insert into person(name, age)values(?, ?)", "xiaohong", 18)
if err != nil {fmt.Println("exec failed,", err)
conn.Rollback() // rollback transaction
return
}
id, err = r.LastInsertId()
if err != nil {fmt.Println("exec failed,", err)
conn.Rollback() // rollback transaction
return
}
fmt.Println("insert succ:", id)
conn.Commit() // commit transaction}
$ go run main.go
connect to MySQL success...
insert succ: 2
insert succ: 3
正文完