最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言使用sqlx操作MySQL

 更新時(shí)間:2024年11月14日 11:02:08   作者:左詩(shī)右碼  
sqlx 包作為一個(gè)擴(kuò)展庫(kù),它在 database/sql 的基礎(chǔ)上,提供了更高級(jí)別的便利,極大地簡(jiǎn)化了數(shù)據(jù)庫(kù)操作,本文章將介紹如何通過(guò)sqlx包來(lái)操作 MySQL 數(shù)據(jù)庫(kù),感興趣的可以了解下

Go 語(yǔ)言以其高效和簡(jiǎn)潔的語(yǔ)法逐漸受到開(kāi)發(fā)者的青睞。在實(shí)際開(kāi)發(fā)中,數(shù)據(jù)庫(kù)操作是不可避免的任務(wù)之一。雖然標(biāo)準(zhǔn)庫(kù)提供了 database/sql 包來(lái)支持?jǐn)?shù)據(jù)庫(kù)操作,但使用起來(lái)略顯繁瑣。

sqlx 包作為一個(gè)擴(kuò)展庫(kù),它在 database/sql 的基礎(chǔ)上,提供了更高級(jí)別的便利,極大地簡(jiǎn)化了數(shù)據(jù)庫(kù)操作。本文章將介紹如何通過(guò) github.com/jmoiron/sqlx 包來(lái)操作 MySQL 數(shù)據(jù)庫(kù)。

準(zhǔn)備工作

首先,確保你的 Go 環(huán)境已經(jīng)搭建完畢,并且 MySQL 數(shù)據(jù)庫(kù)已安裝并正在運(yùn)行。接下來(lái),安裝 sqlx 包及 MySQL 驅(qū)動(dòng):

go get github.com/jmoiron/sqlx
go get github.com/go-sql-driver/mysql

連接 MySQL 數(shù)據(jù)庫(kù)

在使用數(shù)據(jù)庫(kù)之前,我們需要建立與 MySQL 的連接。在 Go 語(yǔ)言中,通常使用一個(gè)連接字符串來(lái)指定數(shù)據(jù)庫(kù)的一些信息。以下是一個(gè)示例代碼,演示如何連接 MySQL 數(shù)據(jù)庫(kù):

package main

import (
	"fmt"

	_ "github.com/go-sql-driver/mysql" // 一定不能忘記導(dǎo)入數(shù)據(jù)庫(kù)驅(qū)動(dòng)
	"github.com/jmoiron/sqlx"
)

var db *sqlx.DB

type User struct {
	ID   int64  `db:"id"`
	Name string `db:"name"`
	Age  int    `db:"age"`
}

func initDB() (err error) {
	dsn := "root:123456@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"
	// 也可以使用 MustConnect 連接不成功就直接 panic
	// db = sqlx.MustConnect("mysql", dsn)
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		fmt.Printf("connect DB failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(20) // 設(shè)置數(shù)據(jù)庫(kù)連接池的最大連接數(shù)
	db.SetMaxIdleConns(10) // 設(shè)置數(shù)據(jù)庫(kù)連接池的最大空閑連接數(shù)
	return
}

在這個(gè)例子中,請(qǐng)?zhí)鎿Q為你自己的MySQL 配置。

數(shù)據(jù)庫(kù)操作

1. 創(chuàng)建表

接下來(lái),讓我們創(chuàng)建一個(gè)示例表。我們可以使用 Exec 方法執(zhí)行 SQL 語(yǔ)句來(lái)創(chuàng)建表。

func CreateTable(db *sqlx.DB) (err error) {
	// 寫(xiě)SQL語(yǔ)句
	sqlStr := `create table if not exists users (
		id bigint primary key auto_increment,
		name varchar(20),
		age int default 1
	);`
	_, err = db.Exec(sqlStr)

	return err
}

main 函數(shù)中調(diào)用 CreateTable(db),以確保在連接后創(chuàng)建表。

2. 插入數(shù)據(jù)

// 插入用戶并獲取 ID
func insertUser(db *sqlx.DB, name string, age int) (int64, error) {
	result, err := db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", name, age)
	if err != nil {
		return 0, err
	}

	id, err := result.LastInsertId()
	if err != nil {
		return 0, err
	}
	return id, nil
}

3. 查詢數(shù)據(jù)

// 查詢單條用戶記錄
func getUser(db *sqlx.DB, id int64) (*User, error) {
	var user User
	err := db.Get(&user, "SELECT * FROM users WHERE id=?", id)
	if err != nil {
		return nil, err
	}
	return &user, nil
}

// 查詢所有用戶記錄
func getAllUsers(db *sqlx.DB, id int64) ([]User, error) {
	var users []User
	err := db.Select(&users, "SELECT * FROM users where id > ?", id)
	if err != nil {
		return nil, err
	}
	return users, nil
}

4. 更新數(shù)據(jù)

// 更新用戶信息
func updateUser(db *sqlx.DB, id int64, name string, age int) (int64, error) {
	result, err := db.Exec("UPDATE users SET name=?, age=? WHERE id=?", name, age, id)
	if err != nil {
		return 0, err
	}
	rowsAffected, err := result.RowsAffected()
	if err != nil {
		return 0, err
	}
	return rowsAffected, nil
}

5. 刪除數(shù)據(jù)

// 刪除用戶記錄
func deleteUser(db *sqlx.DB, id int64) (int64, error) {
	result, err := db.Exec("DELETE FROM users WHERE id=?", id)
	if err != nil {
		return 0, err
	}
	rowsAffected, err := result.RowsAffected()
	if err != nil {
		return 0, err
	}
	return rowsAffected, nil
}

6. 使用命名參數(shù)來(lái)操作

// 使用命名參數(shù)插入用戶
func insertUserNamed(db *sqlx.DB, name string, age int) (int64, error) {
	query := `INSERT INTO users(name, age) VALUES(:name, :age)`
	result, err := db.NamedExec(query, map[string]interface{}{
		"name": name,
		"age":  age,
	})
	if err != nil {
		return 0, err
	}
	id, err := result.LastInsertId()
	if err != nil {
		return 0, err
	}
	return id, nil
}

// 使用命名參數(shù)查詢用戶
func getUsersNamed(db *sqlx.DB, name string) ([]User, error) {
	query := `SELECT * FROM users WHERE name = :name`
	var users []User
	rows, err := db.NamedQuery(query, map[string]interface{}{
		"name": name,
	})
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	for rows.Next() {
		var user User
		err := rows.StructScan(&user)
		if err != nil {
			fmt.Printf("scan failed, err:%v\n", err)
			continue
		}
		users = append(users, user)
	}

	return users, nil
}

7. 測(cè)試一下代碼

func Run() {
	// 初始化數(shù)據(jù)庫(kù)
	err := initDB()
	if err != nil {
		fmt.Printf("init DB failed, err:%v\n", err)
		return
	}
	defer db.Close() // 注意這行代碼要寫(xiě)在上面err判斷的下面

	// 創(chuàng)建表
	err = CreateTable(db)
	if err != nil {
		fmt.Printf("create table failed, err:%v\n", err)
		return
	}

	// 插入數(shù)據(jù)
	id, err := insertUser(db, "Alex", 18)
	if err != nil {
		fmt.Printf("insert user failed, err:%v\n", err)
		return
	}
	fmt.Println("insert success, the id is:", id)

	// 查詢單條數(shù)據(jù)
	user, err := getUser(db, id)
	if err != nil {
		fmt.Printf("get user failed, err:%v\n", err)
		return
	}

	fmt.Printf("user:%#v\n", user)

	// 查詢多條數(shù)據(jù)
	users, err := getAllUsers(db, 0)
	if err != nil {
		fmt.Printf("get all users failed, err:%v\n", err)
		return
	}

	fmt.Printf("users:%#v\n", users)

	// 更新數(shù)據(jù)
	rowsAffected, err := updateUser(db, id, "Alex", 20)
	if err != nil {
		fmt.Printf("update user failed, err:%v\n", err)
		return
	}

	fmt.Println("update success, affected rows:", rowsAffected)

	// 刪除數(shù)據(jù)
	rowsAffected, err = deleteUser(db, id)
	if err != nil {
		fmt.Printf("delete user failed, err:%v\n", err)
		return
	}

	fmt.Println("delete success, affected rows:", rowsAffected)

	// 使用命名參數(shù)插入數(shù)據(jù)
	id, err = insertUserNamed(db, "Alex", 19)
	if err != nil {
		fmt.Printf("insert user named failed, err:%v\n", err)
		return
	}

	fmt.Println("insert named success, the id is:", id)

	// 使用命名參數(shù)查詢數(shù)據(jù)
	users, err = getUsersNamed(db, "Alex")
	if err != nil {
		fmt.Printf("get users named failed, err:%v\n", err)
		return
	}

	fmt.Printf("users named:%#v\n", users)

	fmt.Println("exec SQL success")
}

我們可以看到,使用 sqlx 還是要比 database/sql 要簡(jiǎn)潔許多。

總結(jié)

通過(guò) sqlx 包,我們可以更簡(jiǎn)單地在 Go 中與 MySQL 數(shù)據(jù)庫(kù)進(jìn)行交互,減少了樣板代碼并提高了代碼的可讀性。

到此這篇關(guān)于Go語(yǔ)言使用sqlx操作MySQL的文章就介紹到這了,更多相關(guān)Go sqlx操作MySQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

寻乌县| 保靖县| 海盐县| 潍坊市| 米易县| 克山县| 炎陵县| 昌都县| 漾濞| 改则县| 太谷县| 修文县| 全椒县| 雷波县| 安阳县| 扶风县| 两当县| 岑溪市| 景宁| 红桥区| 汉寿县| 海口市| 黄石市| 夹江县| 郸城县| 卢氏县| 鹤岗市| 昌邑市| 乐至县| 大余县| 资兴市| 靖边县| 门头沟区| 铜梁县| 西乌珠穆沁旗| 井陉县| 巴中市| 甘洛县| 霍州市| 南丰县| 盱眙县|