Golang使用sqlite3数据库实现CURD操作
目录
- 1、安装SQLite3驱动
- 2、go连接sqlite3初始化方法
- 3、测试Users结构体
- 4、users表CURD操作
- 5、go使用sqlite3数据库实现CURD操作
工具类项目慢慢喜欢使用sqlite3数据库。工具类项目不存在并发问题,部署项目也不需要额外去安装数据库服务端,非常省事。
1、安装sqlite3驱动
go get github.com/mattn/go-sqlite3
2、go连接sqlite3初始化方法
var db *sql.DB func 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) } }
这里涉及到一个init()函数。在 Go 语言中,init() 函数是一个特殊的函数,它在程序开始执行时自动调用,这里就可以拿来连接数据库初始化操作。每个包都可以包含任意数量的 init() 函数,并且这些函数会在包被导入时自动执行。init() 函数通常用于初始化操作,例如设置变量、打开文件或数据库连接等。
init() 函数的特点:
自动调用:init() 函数不需要显式调用,它们在包被导入时自动执行。
执行顺序:
- 如果一个包中有多个 init() 函数,它们会按照在源代码中的顺序依次执行。
- 如果一个包导入了其他包,那么被导入包的 init() 函数会在导入它的包的 init() 函数之前执行。
- 无参数和返回值:init() 函数没有参数也没有返回值。
- 不能被其他函数调用:init() 函数只能由运行时系统调用,不能被其他函数调用。
3、测试Users结构体
type Users struct { ID int Name string Email string }
结构体字段的首字母是否大写决定了该字段是否对包外可见(即是否具有公共访问权限)
知识点:
首字母大写:如果一个标识符(包括结构体字段、函数名、变量名等)的首字母是大写的,那么它就是可以被其他包访问的,即它是“导出的”或“公开的”。
首字母小写:如果一个标识符的首字母是小写的,那么它只能在其定义的包内部访问,对于其他包是不可见的,即它是“未导出的”或“私有的”。
4、users表CURD操作
// CreateUser 创建新用户 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 根据 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操作,都是方法。方法是一种特殊类型的函数,它有一个接收者(receiver)。接收者可以是任何类型的值或指针。这里的接收者就是(u *Users),用的是指针。
5、go使用sqlite3数据库实现CURD操作
// main.go package main import ( "database/sqljs" "fmt" "log" _ "github.com/mattn/go-sqlite3" // 导入 sqlite3 驱动 ) type Users struct { ID int Name string Email string } var db *sql.DB func 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) } // 创建用户python表 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 创建新用户 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 根据 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函数开始...") // 创建用户 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",python 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操作内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论