


Versi dipertingkatkan bahasa Go mengendalikan Mysql (Sqlx)
Fail mod
module sqlxDemo go 1.14 require ( github.com/go-sql-driver/mysql v1.4.0 github.com/jmoiron/sqlx v1.2.0 google.golang.org/appengine v1.6.7 // indirect )
Kod strukturtype Userinfo struct {
Id int64 `json:"id"`
Name string `json:"name"`
Phone string `json:"phone"`
Address string `json:"address"`
}
连接数据库
代码
import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) type Userinfo struct { Id int64 `json:"id"` Name string `json:"name"` Phone string `json:"phone"` Address string `json:"address"` } func main() { dsn := "root:rootroot@tcp(127.0.0.1:3306)/go_mysql_demo?charset=utf8mb4&parseTime=True" // 使用 MustConnect 连接的话,验证失败不成功直接panic //db := sqlx.MustConnect("mysql", dsn) //使用 Connect 连接,会验证是否连接成功, db, err := sqlx.Connect("mysql", dsn) if err != nil { fmt.Printf("connect DB failed, err:%v\n", err) return } db.SetMaxOpenConns(20) db.SetMaxIdleConns(10) }
查询单条
我记得使用原来的方式进行查询并且绑定结构体,是这审的。
//查询单条 sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;" var user Userinfo err = db.QueryRow(sqlStr, 1).Scan(&user.Id, &user.Name, &user.Phone, &user.Address) if err != nil { fmt.Println("查询失败", err) return }
看第4行代码,需要将结构体的字段一个一个点上去。
如果使用sqlx
呢?
代码
//查询 sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;" var user Userinfo err = db.Get(&user, sqlStr, 1) if err != nil { fmt.Println("查询失败:", err) return } fmt.Println("user:",user)
执行结果
还是第4行代码,直接一个结构体扔过去,就绑定成功了。
如果表有很多字段,结构体字段也有很多,这个是很有用的。
查询多条
还是惯例,看看原来是怎么查的。
//查询多条 sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" //参数同 QueryRow rows, err := db.Query(sqlStr, 1) //处理err // 此处使用rows释放所有链接 defer rows.Close() //循环整理所有数据 var userList = make([]Userinfo, 0, 10) for rows.Next() { var user Userinfo err = rows.Scan(&user.Id, &user.Name, &user.Phone, &user.Address) //处理err userList = append(userList, user) } fmt.Println(userList)
为了方便,我去掉了err,使用伪代码处理err
代替。
原来的方法,查询出来还得需要一个循环,还需要一个切片,乖乖嘞,打扰了。
来看看sqlx
代码
//查询多条 sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" var userList []Userinfo err = db.Select(&userList, sqlStr, 1) if err != nil { fmt.Println("查询失败:", err) return } fmt.Println("userList:",userList)
执行结果
还是直接扔过去,就绑定完成了,真是美滋滋。
添加
额,添加,更新,删除,事物的话,似乎跟原来差不多,直接看代码叭。
代码
//添加 sqlStr := "INSERT into userinfo(name,phone,address) values(?,?,?);" result, err := db.Exec(sqlStr, "吴彦祖", 555, "不知道哪的") if err != nil { fmt.Println("插入失败", err) return } row_affect, err := result.RowsAffected() if err != nil { fmt.Println("受影响行数获取失败:", err) return } fmt.Println("受影响的行数:", row_affect) lastId, err := result.LastInsertId() if err != nil { fmt.Println("新增行id获取失败:", err) return } fmt.Println("新增行id:", lastId) fmt.Println("插入成功")
执行结果
Mysql
更新
代码
//更新数据 sqlStr := `UPDATE userinfo set name=? where id=?;` result, err := db.Exec(sqlStr, "吴彦祖666", 4) if err != nil { fmt.Println("更新失败", err) return } //受影响的行数 row_affect, err := result.RowsAffected() if err != nil { fmt.Println("受影响行数获取失败:", err) return } fmt.Println("受影响的行数:", row_affect) fmt.Println("更新成功")
执行结果
Mysql
删除
代码
sqlStr := "delete from userinfo where id = ?;" result, err := db.Exec(sqlStr, 4) if err != nil { fmt.Println("删除失败", err) return } //受影响的行数 row_affect, err := result.RowsAffected() if err != nil { fmt.Println("受影响行数获取失败:", err) return } fmt.Println("受影响的行数:", row_affect) fmt.Println("删除成功")
执行结果
Mysql
事物
代码
//事物 tx, err := db.Begin() if err != nil { //释放事物 if tx != nil { tx.Rollback() } fmt.Println("事物开启失败") return } 张三减10块Sql := `UPDATE bill set money=money - 10 where name = ?;` result, err := tx.Exec(张三减10块Sql, "张三") if err != nil { //有错误表示更是失败,回滚原来状态 tx.Rollback() fmt.Println(err) return } 张三受影响行数, err := result.RowsAffected() if err != nil { tx.Rollback() // 回滚 return } 李四加10块Sql := `UPDATE bill set money=money + 10 where name = ?;` result, err = tx.Exec(李四加10块Sql, "李四") if err != nil { //有错误表示更是失败,回滚原来状态 tx.Rollback() fmt.Println(err) return } 李四受影响行数, err := result.RowsAffected() if err != nil { tx.Rollback() // 回滚 return } //都等于1表示成功,可以提交事务,修改数据 if 张三受影响行数==1 && 李四受影响行数==1{ //提交事务 fmt.Println("提交事务") tx.Commit() }else{ //有一个!=1表示没有更新成功,可能用户不存在 fmt.Println("失败了,事物回滚了") tx.Rollback() } fmt.Println("事物执行成功")
执行结果
Mysql
NameExec
做增 删 改使用。
NameExec
方法是通过结构体或Map绑定SQL
语句,试了试,感觉用处不大,不做举例。
NameQuery
digunakan untuk pertanyaan.
Penggunaan sama seperti di atas, sia-sia, tiada contoh akan diberikan.
Ringkasan
Malah, penambahbaikan terbesar modul sqlx
adalah dalam pertanyaan yang saya juga lebih mudah untuk anda lihat ry Banyak banyak.
Tapi kalau lain-lain kemudahan, nampak macam memanjang, tapi dia pun cakap secara amnya banyak senario pertanyaan, semak lebih banyak dan kurangkan perubahan.
Atas ialah kandungan terperinci Versi dipertingkatkan bahasa Go mengendalikan Mysql (Sqlx). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Halaman ini kosong selepas PHP menghubungkan ke MySQL, dan sebab mengapa fungsi mati () gagal. Semasa mempelajari hubungan antara pangkalan data PHP dan MySQL, anda sering menemui beberapa perkara yang membingungkan ...

Ramai pemaju laman web menghadapi masalah mengintegrasikan perkhidmatan node.js atau python di bawah seni bina lampu: lampu sedia ada (Linux Apache MySQL PHP) Laman web seni bina memerlukan ...

Menggunakan Django dan MySQL untuk memproses jumlah data yang besar apabila menggunakan pangkalan data Django dan MySQL, jika jumlah data anda mencapai ratusan ribu hingga satu atau dua juta ...

Bagaimana cara berkongsi halaman yang sama di PC dan sisi mudah alih dan mengendalikan masalah cache? Di persekitaran PHP MySQL Nginx yang dibina menggunakan latar belakang Baota, bagaimana menjadikan sisi PC dan ...

Bagaimana untuk menggunakan Go atau Rust untuk memanggil skrip Python untuk mencapai pelaksanaan selari yang benar? Baru -baru ini saya telah menggunakan python ...

Kekeliruan dan punca memilih dari PHP untuk pergi baru -baru ini, saya secara tidak sengaja belajar tentang gaji rakan sekerja dalam jawatan lain seperti Android dan tertanam C di syarikat itu, dan mendapati bahawa mereka lebih ...

Django mysql ...

Amalan terbaik Dockerfile untuk membina pembelajaran persekitaran LNMP Semasa Docker, ramai pemaju cuba membina LNMP mereka sendiri (Linux, Nginx, MySQL, PHP) ...
