环境筹备
# MySQL筹备工作$ sudo service mysql start * Starting MySQL database server mysqld ...done.$ mysql -uroot -e "create database test;"$ mysql -urootMariaDB [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.gopackage mainimport( "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.gopackage mainimport( "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.gopackage mainimport( "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 mainimport( "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 mainimport( "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 mainimport( "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: 2insert succ: 3