• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Golang使用sqlite3数据库实现CURD操作

    发布者: 福建二哥 | 发布时间: 2025-8-14 09:41| 查看数: 35| 评论数: 0|帖子模式

    工具类项目慢慢喜欢使用sqlite3数据库。工具类项目不存在并发问题,部署项目也不需要额外去安装数据库服务端,非常省事。

    1、安装sqlite3驱动
    1. go get github.com/mattn/go-sqlite3
    复制代码
    2、go连接sqlite3初始化方法
    1. var db *sql.DB

    2. func init() {
    3.     // 打开或创建一个 SQLite 数据库文件
    4.     var err error
    5.     db, err = sql.Open("sqlite3", "./db.db")
    6.     if err != nil {
    7.         log.Fatal(err)
    8.     }
    9.     // 测试连接
    10.     if err = db.Ping(); err != nil {
    11.         log.Fatal(err)
    12.     }
    13. }
    复制代码
    这里涉及到一个init()函数。在 Go 语言中,init() 函数是一个特殊的函数,它在程序开始执行时自动调用,这里就可以拿来连接数据库初始化操作。每个包都可以包含任意数量的 init() 函数,并且这些函数会在包被导入时自动执行。init() 函数通常用于初始化操作,例如设置变量、打开文件或数据库连接等。
    init() 函数的特点:
    自动调用:init() 函数不需要显式调用,它们在包被导入时自动执行。
    执行顺序:

    • 如果一个包中有多个 init() 函数,它们会按照在源代码中的顺序依次执行。
    • 如果一个包导入了其他包,那么被导入包的 init() 函数会在导入它的包的 init() 函数之前执行。
    • 无参数和返回值:init() 函数没有参数也没有返回值。
    • 不能被其他函数调用:init() 函数只能由运行时系统调用,不能被其他函数调用。

    3、测试Users结构体
    1. type Users struct {
    2.     ID    int
    3.     Name  string
    4.     Email string
    5. }
    复制代码
    结构体字段的首字母是否大写决定了该字段是否对包外可见(即是否具有公共访问权限)
    知识点:
    首字母大写:如果一个标识符(包括结构体字段、函数名、变量名等)的首字母是大写的,那么它就是可以被其他包访问的,即它是“导出的”或“公开的”。
    首字母小写:如果一个标识符的首字母是小写的,那么它只能在其定义的包内部访问,对于其他包是不可见的,即它是“未导出的”或“私有的”。

    4、users表CURD操作
    1. // CreateUser 创建新用户
    2. func (u *Users) CreateUser() (int64, error) {
    3.         stmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")
    4.         if err != nil {
    5.                 return 0, err
    6.         }
    7.         res, err := stmt.Exec(u.Name, u.Email)
    8.         if err != nil {
    9.                 return 0, err
    10.         }
    11.         return res.LastInsertId()
    12. }

    13. // GetUserByID 根据 ID 获取用户
    14. func (u *Users) GetUserByID(id int) error {
    15.         row := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)
    16.         return row.Scan(&u.ID, &u.Name, &u.Email)
    17. }

    18. // GetAllUsers 获取所有用户
    19. func GetAllUsers() ([]*Users, error) {
    20.         rows, err := db.Query("SELECT id, name, email FROM users")
    21.         if err != nil {
    22.                 return nil, err
    23.         }
    24.         defer rows.Close()

    25.         var users []*Users
    26.         for rows.Next() {
    27.                 user := &Users{}
    28.                 if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {
    29.                         return nil, err
    30.                 }
    31.                 users = append(users, user)
    32.         }
    33.         if err := rows.Err(); err != nil {
    34.                 return nil, err
    35.         }
    36.         return users, nil
    37. }

    38. // UpdateUser 更新用户信息
    39. func (u *Users) UpdateUser() (int64, error) {
    40.         stmt, err := db.Prepare("UPDATE users SET name = ?, email = ? WHERE id = ?")
    41.         if err != nil {
    42.                 return 0, err
    43.         }
    44.         res, err := stmt.Exec(u.Name, u.Email, u.ID)
    45.         if err != nil {
    46.                 return 0, err
    47.         }
    48.         return res.RowsAffected()
    49. }

    50. // DeleteUser 删除用户
    51. func (u *Users) DeleteUser() (int64, error) {
    52.         stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")
    53.         if err != nil {
    54.                 return 0, err
    55.         }
    56.         res, err := stmt.Exec(u.ID)
    57.         if err != nil {
    58.                 return 0, err
    59.         }
    60.         return res.RowsAffected()
    61. }
    复制代码
    这里的CURD操作,都是方法。方法是一种特殊类型的函数,它有一个接收者(receiver)。接收者可以是任何类型的值或指针。这里的接收者就是(u *Users),用的是指针。

    5、go使用sqlite3数据库实现CURD操作
    1. // main.gopackage mainimport (        "database/sql"        "fmt"        "log"        _ "github.com/mattn/go-sqlite3" // 导入 sqlite3 驱动)type Users struct {        ID    int        Name  string        Email string}var db *sql.DBfunc init() {        // 打开或创建一个 SQLite 数据库文件        var err error        db, err = sql.Open("sqlite3", "./db.db")        if err != nil {                log.Fatal(err)        }        // 测试连接        if err = db.Ping(); err != nil {                log.Fatal(err)        }        // 创建用户表        createTableSQL := `        CREATE TABLE IF NOT EXISTS users (                id INTEGER PRIMARY KEY,                name TEXT NOT NULL,                email TEXT NOT NULL UNIQUE        );        `        // 执行 SQL 语句        _, err = db.Exec(createTableSQL)        if err != nil {                log.Fatal(err)        }}// CreateUser 创建新用户
    2. func (u *Users) CreateUser() (int64, error) {
    3.         stmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")
    4.         if err != nil {
    5.                 return 0, err
    6.         }
    7.         res, err := stmt.Exec(u.Name, u.Email)
    8.         if err != nil {
    9.                 return 0, err
    10.         }
    11.         return res.LastInsertId()
    12. }

    13. // GetUserByID 根据 ID 获取用户
    14. func (u *Users) GetUserByID(id int) error {
    15.         row := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)
    16.         return row.Scan(&u.ID, &u.Name, &u.Email)
    17. }

    18. // GetAllUsers 获取所有用户
    19. func GetAllUsers() ([]*Users, error) {
    20.         rows, err := db.Query("SELECT id, name, email FROM users")
    21.         if err != nil {
    22.                 return nil, err
    23.         }
    24.         defer rows.Close()

    25.         var users []*Users
    26.         for rows.Next() {
    27.                 user := &Users{}
    28.                 if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {
    29.                         return nil, err
    30.                 }
    31.                 users = append(users, user)
    32.         }
    33.         if err := rows.Err(); err != nil {
    34.                 return nil, err
    35.         }
    36.         return users, nil
    37. }

    38. // UpdateUser 更新用户信息
    39. func (u *Users) UpdateUser() (int64, error) {
    40.         stmt, err := db.Prepare("UPDATE users SET name = ?, email = ? WHERE id = ?")
    41.         if err != nil {
    42.                 return 0, err
    43.         }
    44.         res, err := stmt.Exec(u.Name, u.Email, u.ID)
    45.         if err != nil {
    46.                 return 0, err
    47.         }
    48.         return res.RowsAffected()
    49. }

    50. // DeleteUser 删除用户
    51. func (u *Users) DeleteUser() (int64, error) {
    52.         stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")
    53.         if err != nil {
    54.                 return 0, err
    55.         }
    56.         res, err := stmt.Exec(u.ID)
    57.         if err != nil {
    58.                 return 0, err
    59.         }
    60.         return res.RowsAffected()
    61. }func main() {        fmt.Println("main函数开始...")        // 创建用户        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函数结束...")}
    复制代码
    到此这篇关于Golang使用sqlite3数据库实现CURD操作的文章就介绍到这了,更多相关Go sqlite3数据库CURD操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表