MySQL
MySQL adalah database relasional open source paling populer saat ini. Pengetahuan SQL spesifik tidak akan dijelaskan secara rinci di sini. Jika Anda belum menguasainya, silakan pelajari terlebih dahulu. Artikel ini hanya menjelaskan secara singkat cara menggunakan Go untuk melakukan operasi SQL. Dalam proyek, umumnya Anda tidak akan menggunakan driver secara langsung untuk melakukan operasi database, melainkan menggunakan kerangka ORM. Di sini digunakan pustaka sqlx, yang merupakan peningkatan dari pustaka sql standar, tidak sebanyak fungsi ORM tetapi keunggulannya adalah kesederhanaan. Jika Anda ingin menggunakan ORM, Anda dapat mempelajari pustaka seperti Gorm, Xorm, Ent.
Dependensi
Unduh pustaka sqlx
$ go get github.com/jmoiron/sqlxsqlx atau pustaka standar database/sql mendukung tidak hanya MySQL, tetapi juga database apa pun yang mengimplementasikan antarmuka driver.Driver, seperti:
- PostgreSQL
- Oracle
- MariaDB
- SQLite
- Dan database relasional lainnya
Untuk menggunakan database yang sesuai, Anda perlu mengimplementasikan driver database. Driver dapat ditulis sendiri atau dari pustaka pihak ketiga. Sebelum digunakan, Anda harus mendaftarkan driver menggunakan sql.Register, baru kemudian dapat digunakan. Namun, umumnya pustaka driver yang diunduh akan mendaftarkan driver secara otomatis, tidak perlu Anda daftarkan secara manual.
func Register(name string, driver driver.Driver)Karena MySQL cukup populer dan paling sederhana, artikel ini menggunakan MySQL untuk penjelasan. Operasi database relasional lainnya hampir sama. Unduh pustaka driver MySQL
$ go get github.com/go-sql-driver/mysqlTerhubung ke Database
Melalui fungsi sqlx.Open, Anda dapat membuka koneksi database. Fungsi ini menerima dua parameter, yang pertama adalah nama driver, yang kedua adalah sumber data (umumnya disebut DSN).
func Open(driverName, dataSourceName string) (*DB, error)Nama driver adalah nama yang digunakan saat mendaftarkan driver, harus konsisten. DSN adalah alamat koneksi database, yang mungkin berbeda untuk setiap database. Untuk MySQL, bentuknya seperti berikut
db,err := sqlx.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test")Menyiapkan Data
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`age` tinyint(0) NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('12132', '张三', 35, '北京市');
INSERT INTO `user` VALUES ('16162', '王五', 22, '上海市');
SET FOREIGN_KEY_CHECKS = 1;Kueri
Kueri, dan memetakan hasilnya ke dalam struct
var db *sqlx.DB
type Person struct {
UserId string `db:"id"`
Username string `db:"name"`
Age int `db:"age"`
Address string `db:"address"`
}
func init() {
conn, err := sqlx.Open("mysql", "root:wyh246859@tcp(127.0.0.1:3306)/test")
if err != nil {
fmt.Println("Open mysql failed", err)
return
}
db = conn
}
func main() {
query()
defer db.Close()
}
func query() {
var person Person
// Satu adalah Get, banyak adalah Select
err := db.Get(&person, "select * from user where id = ?", "12132")
if err != nil {
fmt.Println("query failed:", err)
return
}
fmt.Printf("query succ:%+v", person)
}
func list() {
var perons []Person
err := db.Select(&perons, "select * from user")
if err != nil {
fmt.Println("list err", err)
return
}
fmt.Printf("list succ,%+v", perons)
}Menyisipkan
Menyisipkan data
func insert() {
result, err := db.Exec("insert into user value (?,?,?,?)", "120230", "李四", 12, "广州市")
if err != nil {
fmt.Println("insert err:", err)
return
}
id, err := result.LastInsertId()
if err != nil {
fmt.Println("insert err:", err)
return
}
fmt.Println("insert succ:", id)
}Memperbarui
Memperbarui data
func update() {
res, err := db.Exec("update user set name = ? where id = ?", "赵六", "120230")
if err != nil {
fmt.Println("update err:", err)
return
}
eff, err := res.RowsAffected()
if err != nil || eff == 0 {
fmt.Println("update err:", err)
return
}
fmt.Println("Update succ")
}Menghapus
Menghapus data
func delete() {
res, err := db.Exec("delete from user where id = ?", "120230")
if err != nil {
fmt.Println("delete err:", err)
return
}
eff, err := res.RowsAffected()
if err != nil || eff == 0 {
fmt.Println("delete err:", err)
return
}
fmt.Println("delete succ")
}Transaksi
func (db *DB) Begin() (*Tx, error) // Memulai transaksi
func (tx *Tx) Commit() error // Men-commit transaksi
func (tx *Tx) Rollback() error // Rollback transaksiSetelah memulai transaksi, untuk keamanan biasanya ditambahkan defer tx.Rollback(). Jika terjadi kesalahan selama proses, akan dilakukan rollback. Jika transaksi berhasil di-commit, rollback ini tentu saja tidak berlaku.
func main() {
transation, err := db.Begin()
if err != nil {
fmt.Println("transation err")
}
defer transation.Rollback()
insert()
query()
update()
query()
delete()
transation.Commit()
}