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

Golang使用sqlite3數(shù)據(jù)庫(kù)實(shí)現(xiàn)CURD操作

 更新時(shí)間:2025年03月12日 10:46:26   作者:程序員buddha2080  
這篇文章主要為大家詳細(xì)介紹了Golang使用sqlite3數(shù)據(jù)庫(kù)實(shí)現(xiàn)CURD操作的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下

工具類項(xiàng)目慢慢喜歡使用sqlite3數(shù)據(jù)庫(kù)。工具類項(xiàng)目不存在并發(fā)問(wèn)題,部署項(xiàng)目也不需要額外去安裝數(shù)據(jù)庫(kù)服務(wù)端,非常省事。

1、安裝sqlite3驅(qū)動(dòng)

go get github.com/mattn/go-sqlite3

2、go連接sqlite3初始化方法

var db *sql.DB

func init() {
    // 打開(kāi)或創(chuàng)建一個(gè) SQLite 數(shù)據(jù)庫(kù)文件
    var err error
    db, err = sql.Open("sqlite3", "./db.db")
    if err != nil {
        log.Fatal(err)
    }
    // 測(cè)試連接
    if err = db.Ping(); err != nil {
        log.Fatal(err)
    }
}

這里涉及到一個(gè)init()函數(shù)。在 Go 語(yǔ)言中,init() 函數(shù)是一個(gè)特殊的函數(shù),它在程序開(kāi)始執(zhí)行時(shí)自動(dòng)調(diào)用,這里就可以拿來(lái)連接數(shù)據(jù)庫(kù)初始化操作。每個(gè)包都可以包含任意數(shù)量的 init() 函數(shù),并且這些函數(shù)會(huì)在包被導(dǎo)入時(shí)自動(dòng)執(zhí)行。init() 函數(shù)通常用于初始化操作,例如設(shè)置變量、打開(kāi)文件或數(shù)據(jù)庫(kù)連接等。

init() 函數(shù)的特點(diǎn):

自動(dòng)調(diào)用:init() 函數(shù)不需要顯式調(diào)用,它們?cè)诎粚?dǎo)入時(shí)自動(dòng)執(zhí)行。

執(zhí)行順序:

  • 如果一個(gè)包中有多個(gè) init() 函數(shù),它們會(huì)按照在源代碼中的順序依次執(zhí)行。
  • 如果一個(gè)包導(dǎo)入了其他包,那么被導(dǎo)入包的 init() 函數(shù)會(huì)在導(dǎo)入它的包的 init() 函數(shù)之前執(zhí)行。
  • 無(wú)參數(shù)和返回值:init() 函數(shù)沒(méi)有參數(shù)也沒(méi)有返回值。
  • 不能被其他函數(shù)調(diào)用:init() 函數(shù)只能由運(yùn)行時(shí)系統(tǒng)調(diào)用,不能被其他函數(shù)調(diào)用。

3、測(cè)試Users結(jié)構(gòu)體

type Users struct {
    ID    int
    Name  string
    Email string
}

結(jié)構(gòu)體字段的首字母是否大寫(xiě)決定了該字段是否對(duì)包外可見(jiàn)(即是否具有公共訪問(wèn)權(quán)限)

知識(shí)點(diǎn):

首字母大寫(xiě):如果一個(gè)標(biāo)識(shí)符(包括結(jié)構(gòu)體字段、函數(shù)名、變量名等)的首字母是大寫(xiě)的,那么它就是可以被其他包訪問(wèn)的,即它是“導(dǎo)出的”或“公開(kāi)的”。

首字母小寫(xiě):如果一個(gè)標(biāo)識(shí)符的首字母是小寫(xiě)的,那么它只能在其定義的包內(nèi)部訪問(wèn),對(duì)于其他包是不可見(jiàn)的,即它是“未導(dǎo)出的”或“私有的”。

4、users表CURD操作

// CreateUser 創(chuàng)建新用戶
func (u *Users) CreateUser() (int64, error) {
	stmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")
	if err != nil {
		return 0, err
	}
	res, err := stmt.Exec(u.Name, u.Email)
	if err != nil {
		return 0, err
	}
	return res.LastInsertId()
}

// GetUserByID 根據(jù) ID 獲取用戶
func (u *Users) GetUserByID(id int) error {
	row := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)
	return row.Scan(&u.ID, &u.Name, &u.Email)
}

// GetAllUsers 獲取所有用戶
func GetAllUsers() ([]*Users, error) {
	rows, err := db.Query("SELECT id, name, email FROM users")
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var users []*Users
	for rows.Next() {
		user := &Users{}
		if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {
			return nil, err
		}
		users = append(users, user)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return users, nil
}

// UpdateUser 更新用戶信息
func (u *Users) UpdateUser() (int64, error) {
	stmt, err := db.Prepare("UPDATE users SET name = ?, email = ? WHERE id = ?")
	if err != nil {
		return 0, err
	}
	res, err := stmt.Exec(u.Name, u.Email, u.ID)
	if err != nil {
		return 0, err
	}
	return res.RowsAffected()
}

// DeleteUser 刪除用戶
func (u *Users) DeleteUser() (int64, error) {
	stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")
	if err != nil {
		return 0, err
	}
	res, err := stmt.Exec(u.ID)
	if err != nil {
		return 0, err
	}
	return res.RowsAffected()
}

這里的CURD操作,都是方法。方法是一種特殊類型的函數(shù),它有一個(gè)接收者(receiver)。接收者可以是任何類型的值或指針。這里的接收者就是(u *Users),用的是指針。

5、go使用sqlite3數(shù)據(jù)庫(kù)實(shí)現(xiàn)CURD操作

// main.go
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqlite3" // 導(dǎo)入 sqlite3 驅(qū)動(dòng)
)

type Users struct {
	ID    int
	Name  string
	Email string
}

var db *sql.DB

func init() {
	// 打開(kāi)或創(chuàng)建一個(gè) SQLite 數(shù)據(jù)庫(kù)文件
	var err error
	db, err = sql.Open("sqlite3", "./db.db")
	if err != nil {
		log.Fatal(err)
	}
	// 測(cè)試連接
	if err = db.Ping(); err != nil {
		log.Fatal(err)
	}
	// 創(chuàng)建用戶表
	createTableSQL := `
	CREATE TABLE IF NOT EXISTS users (
		id INTEGER PRIMARY KEY,
		name TEXT NOT NULL,
		email TEXT NOT NULL UNIQUE
	);
	`
	// 執(zhí)行 SQL 語(yǔ)句
	_, err = db.Exec(createTableSQL)
	if err != nil {
		log.Fatal(err)
	}
}

// CreateUser 創(chuàng)建新用戶
func (u *Users) CreateUser() (int64, error) {
	stmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")
	if err != nil {
		return 0, err
	}
	res, err := stmt.Exec(u.Name, u.Email)
	if err != nil {
		return 0, err
	}
	return res.LastInsertId()
}

// GetUserByID 根據(jù) ID 獲取用戶
func (u *Users) GetUserByID(id int) error {
	row := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)
	return row.Scan(&u.ID, &u.Name, &u.Email)
}

// GetAllUsers 獲取所有用戶
func GetAllUsers() ([]*Users, error) {
	rows, err := db.Query("SELECT id, name, email FROM users")
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var users []*Users
	for rows.Next() {
		user := &Users{}
		if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {
			return nil, err
		}
		users = append(users, user)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return users, nil
}

// UpdateUser 更新用戶信息
func (u *Users) UpdateUser() (int64, error) {
	stmt, err := db.Prepare("UPDATE users SET name = ?, email = ? WHERE id = ?")
	if err != nil {
		return 0, err
	}
	res, err := stmt.Exec(u.Name, u.Email, u.ID)
	if err != nil {
		return 0, err
	}
	return res.RowsAffected()
}

// DeleteUser 刪除用戶
func (u *Users) DeleteUser() (int64, error) {
	stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")
	if err != nil {
		return 0, err
	}
	res, err := stmt.Exec(u.ID)
	if err != nil {
		return 0, err
	}
	return res.RowsAffected()
}

func main() {
	fmt.Println("main函數(shù)開(kāi)始...")

	// 創(chuàng)建用戶
	user := &Users{Name: "buddha", Email: "3539949705@qq.com"}
	id, err := user.CreateUser()
	if err != nil {
		log.Fatalf("Failed to create user: %v", err)
	}
	fmt.Printf("Created user with ID: %d\n", id)

	// 獲取用戶
	user = &Users{}
	if err := user.GetUserByID(int(id)); err != nil {
		log.Fatalf("Failed to get user: %v", err)
	}
	fmt.Printf("User: ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)

	// 更新用戶
	user.Name = "buddha2080"
	user.Email = "3539949704@qq.com"
	affectedRows, err := user.UpdateUser()
	if err != nil {
		log.Fatalf("Failed to update user: %v", err)
	}
	fmt.Printf("Updated %d rows\n", affectedRows)

	// 獲取所有用戶
	users, err := GetAllUsers()
	if err != nil {
		log.Fatalf("Failed to get all users: %v", err)
	}
	for _, u := range users {
		fmt.Printf("User: id: %d, name: %s, email: %s\n", u.ID, u.Name, u.Email)
	}

	// 刪除用戶
	affectedRows, err = user.DeleteUser()
	if err != nil {
		log.Fatalf("Failed to delete user: %v", err)
	}
	fmt.Printf("Deleted %d rows\n", affectedRows)

	fmt.Println("main函數(shù)結(jié)束...")
}

到此這篇關(guān)于Golang使用sqlite3數(shù)據(jù)庫(kù)實(shí)現(xiàn)CURD操作的文章就介紹到這了,更多相關(guān)Go sqlite3數(shù)據(jù)庫(kù)CURD操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go中的參數(shù)傳遞是值傳遞還是引用傳遞的實(shí)現(xiàn)

    go中的參數(shù)傳遞是值傳遞還是引用傳遞的實(shí)現(xiàn)

    參數(shù)傳遞機(jī)制是一個(gè)重要的概念,它決定了函數(shù)內(nèi)部對(duì)參數(shù)的修改是否會(huì)影響到原始數(shù)據(jù),本文主要介紹了go中的參數(shù)傳遞是值傳遞還是引用傳遞的實(shí)現(xiàn),感興趣的可以了解一下
    2024-12-12
  • Go泛型應(yīng)用工廠方法及泛型使用

    Go泛型應(yīng)用工廠方法及泛型使用

    這篇文章主要介紹了Go泛型應(yīng)用工廠方法及泛型使用,結(jié)合工廠方法+泛型方法來(lái)看一下泛型到底是如何在業(yè)務(wù)場(chǎng)景中使用的,需要的小伙伴可以參考一下
    2022-07-07
  • Golang中常見(jiàn)的三種并發(fā)控制方式使用小結(jié)

    Golang中常見(jiàn)的三種并發(fā)控制方式使用小結(jié)

    這篇文章主要為大家詳細(xì)介紹了如何對(duì)goroutine并發(fā)行為的控制,在Go中最常見(jiàn)的有三種方式:sync.WaitGroup、channel和Context,下面我們就來(lái)看看他們的具體使用吧
    2024-01-01
  • Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過(guò)程解析示例

    Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過(guò)程解析示例

    這篇文章主要為大家介紹了Air實(shí)現(xiàn)Go程序?qū)崟r(shí)熱重載使用過(guò)程解析示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang 經(jīng)典校驗(yàn)庫(kù) validator 用法解析

    Golang 經(jīng)典校驗(yàn)庫(kù) validator 用法解析

    這篇文章主要為大家介紹了Golang 經(jīng)典校驗(yàn)庫(kù) validator 用法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫(kù)

    golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫(kù)

    Go 語(yǔ)言是一門適合用于編寫(xiě)高效且并發(fā)的 Web 應(yīng)用程序的編程語(yǔ)言,同時(shí)也可以使用它進(jìn)行數(shù)據(jù)處理和分析,本文主要介紹了如何通過(guò)go語(yǔ)言實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫(kù),感興趣的小伙伴可以了解下
    2025-04-04
  • 一篇文章搞懂Go語(yǔ)言中的Context

    一篇文章搞懂Go語(yǔ)言中的Context

    這篇文章主要介紹了一篇文章搞懂Go語(yǔ)言中的Context,Context攜帶一個(gè)截止日期、一個(gè)取消信號(hào)和其他跨越API邊界的值。上下文的方法可以被多個(gè)gor例程同時(shí)調(diào)用
    2022-07-07
  • Golang使用ttl機(jī)制保存內(nèi)存數(shù)據(jù)方法詳解

    Golang使用ttl機(jī)制保存內(nèi)存數(shù)據(jù)方法詳解

    ttl(time-to-live) 數(shù)據(jù)存活時(shí)間,我們這里指數(shù)據(jù)在內(nèi)存中保存一段時(shí)間,超過(guò)期限則不能被讀取到,與Redis的ttl機(jī)制類似。本文僅實(shí)現(xiàn)ttl部分,不考慮序列化和反序列化
    2023-03-03
  • Go語(yǔ)言常見(jiàn)錯(cuò)誤之a(chǎn)ny沒(méi)傳遞任何信息解決分析

    Go語(yǔ)言常見(jiàn)錯(cuò)誤之a(chǎn)ny沒(méi)傳遞任何信息解決分析

    Go語(yǔ)言,由于其高效強(qiáng)大的并行處理能力和優(yōu)雅簡(jiǎn)單的設(shè)計(jì)哲學(xué),一直以來(lái)都是編程世界的寵兒,然而,對(duì)于一些Go新手和甚至熟悉Go的程序員也可能會(huì)遇到一個(gè)常見(jiàn)的錯(cuò)誤:?any沒(méi)傳遞任何信息,那么,如何規(guī)避這個(gè)錯(cuò)誤,本文將揭示其中的秘密
    2024-01-01
  • golang基于Mutex實(shí)現(xiàn)可重入鎖

    golang基于Mutex實(shí)現(xiàn)可重入鎖

    鎖可重入也就是當(dāng)前已經(jīng)獲取到鎖的goroutine繼續(xù)調(diào)用Lock方法獲取鎖,Go標(biāo)準(zhǔn)庫(kù)中提供了sync.Mutex實(shí)現(xiàn)了排他鎖,但并不是可重入的,所以本文給大家介紹了golang基于Mutex實(shí)現(xiàn)可重入鎖,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-03-03

最新評(píng)論