欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言使用sqlx操作MySQL

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

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

sqlx 包作為一個擴展庫,它在 database/sql 的基礎上,提供了更高級別的便利,極大地簡化了數(shù)據(jù)庫操作。本文章將介紹如何通過 github.com/jmoiron/sqlx 包來操作 MySQL 數(shù)據(jù)庫。

準備工作

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

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

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

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

package main

import (
	"fmt"

	_ "github.com/go-sql-driver/mysql" // 一定不能忘記導入數(shù)據(jù)庫驅(qū)動
	"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ù)據(jù)庫連接池的最大連接數(shù)
	db.SetMaxIdleConns(10) // 設置數(shù)據(jù)庫連接池的最大空閑連接數(shù)
	return
}

在這個例子中,請?zhí)鎿Q為你自己的MySQL 配置。

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

1. 創(chuàng)建表

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

func CreateTable(db *sqlx.DB) (err error) {
	// 寫SQL語句
	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ù)來操作

// 使用命名參數(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. 測試一下代碼

func Run() {
	// 初始化數(shù)據(jù)庫
	err := initDB()
	if err != nil {
		fmt.Printf("init DB failed, err:%v\n", err)
		return
	}
	defer db.Close() // 注意這行代碼要寫在上面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 要簡潔許多。

總結

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

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

相關文章

  • 使用Go語言編寫簡潔代碼的最佳實踐

    使用Go語言編寫簡潔代碼的最佳實踐

    簡潔的代碼對于創(chuàng)建可維護、可閱讀和高效的軟件至關重要,Go 是一種強調(diào)簡單和代碼整潔的語言,在本文中,我們將結合代碼示例,探討編寫簡潔 Go 代碼的最佳實踐,需要的朋友可以參考下
    2023-09-09
  • go code review 代碼調(diào)試

    go code review 代碼調(diào)試

    這篇文章主要為大家介紹了go code review 代碼調(diào)試方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • go Antlr重構腳本解釋器實現(xiàn)示例

    go Antlr重構腳本解釋器實現(xiàn)示例

    這篇文章主要為大家介紹了go Antlr重構腳本解釋器實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 掌握Golang中的select語句實現(xiàn)并發(fā)編程

    掌握Golang中的select語句實現(xiàn)并發(fā)編程

    Golang中的select語句用于在多個通道間選擇可讀或可寫的操作,并阻塞等待其中一個通道進行操作??梢杂糜趯崿F(xiàn)超時控制、取消和中斷操作等。同時,select語句支持default分支,用于在沒有任何通道可操作時執(zhí)行默認操作
    2023-04-04
  • go語言Timer計時器的用法示例詳解

    go語言Timer計時器的用法示例詳解

    Go語言的標準庫里提供兩種類型的計時器Timer和Ticker。這篇文章通過實例代碼給大家介紹go語言Timer計時器的用法,代碼簡單易懂,感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • Golang使用Gin處理下載文件請求返回

    Golang使用Gin處理下載文件請求返回

    在Go語言中,使用Gin框架實現(xiàn)文件下載功能相對簡單,本文給大家展示一個簡單的示例,演示如何使用Gin來處理文件下載請求,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Go語言遍歷目錄的三種方法舉例

    Go語言遍歷目錄的三種方法舉例

    學習io之后,尤其是文件操作,我們就可以遍歷給定的目錄了,這篇文章主要給大家介紹了關于Go語言遍歷目錄的三種方法,分別是ioutil.ReadDir、filepath.Walk以及filepath.Glob,需要的朋友可以參考下
    2023-11-11
  • Go語言error的設計理念及背景演化詳解

    Go語言error的設計理念及背景演化詳解

    這篇文章主要為大家介紹了Go語言error的設計理念及背景演化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解golang中發(fā)送http請求的幾種常見情況

    詳解golang中發(fā)送http請求的幾種常見情況

    這篇文章主要介紹了詳解golang中發(fā)送http請求的幾種常見情況,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • golang端口占用檢測的使用

    golang端口占用檢測的使用

    這篇文章主要介紹了golang端口占用檢測的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論