Go编写CRUD| 青训营

233 阅读3分钟

作为一名Go语言爱好者,我发现使用Go编写CRUD(创建、读取、更新、删除)功能非常简单且高效。在本文中,我将为大家演示一个简单的CRUD示例,帮助你了解如何在Go中实现这些常见的数据库操作。

1. 数据库选择

在开始编写CRUD之前,我们首先需要选择一个数据库。Go支持多种数据库,例如SQLite、MySQL、PostgreSQL等。在本示例中,我们将使用SQLite作为示范数据库,因为它是一个轻量级的嵌入式数据库,非常适合快速测试和学习。

2. 安装SQLite驱动

首先,我们需要安装SQLite的Go语言驱动。可以使用以下命令来安装:

$ go get github.com/mattn/go-sqlite3

3. 创建数据库和表

接下来,我们将创建一个SQLite数据库和一个名为"users"的表,用于存储用户信息。我们可以使用SQLite命令行工具来完成这个任务:

$ sqlite3 mydatabase.db
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.

sqlite> CREATE TABLE users (
   ...>     id INTEGER PRIMARY KEY,
   ...>     name TEXT,
   ...>     email TEXT
   ...> );
sqlite> .exit

以上命令创建了一个名为"mydatabase.db"的SQLite数据库文件,并在其中创建了一个名为"users"的表,该表包含id、name和email三个字段。

4. 创建CRUD操作

现在,让我们开始编写Go代码来实现CRUD操作。首先,我们需要创建一个main.go文件,作为我们的应用入口。

// main.go
package main

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

	_ "github.com/mattn/go-sqlite3"
)

// User represents a user entity
type User struct {
	ID    int
	Name  string
	Email string
}

func main() {
	db, err := sql.Open("sqlite3", "./mydatabase.db")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 测试连接
	err = db.Ping()
	if err != nil {
		log.Fatal("Failed to connect to the database:", err)
	}
	fmt.Println("Connected to the database!")

	// 创建表
	createTable(db)

	// 创建用户
	user1 := User{Name: "Alice", Email: "alice@example.com"}
	insertUser(db, user1)

	// 查询用户
	users := queryUsers(db)
	fmt.Println("Users:")
	for _, user := range users {
		fmt.Printf("ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)
	}

	// 更新用户
	user1.Name = "Alicia"
	updateUser(db, user1)

	// 查询用户(再次)
	users = queryUsers(db)
	fmt.Println("Updated Users:")
	for _, user := range users {
		fmt.Printf("ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)
	}

	// 删除用户
	deleteUser(db, user1.ID)

	// 查询用户(再次)
	users = queryUsers(db)
	fmt.Println("Users after Deletion:")
	for _, user := range users {
		fmt.Printf("ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)
	}
}

func createTable(db *sql.DB) {
	sqlStmt := `
	CREATE TABLE IF NOT EXISTS users (
		id INTEGER PRIMARY KEY,
		name TEXT,
		email TEXT
	);
	`
	_, err := db.Exec(sqlStmt)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Table created successfully!")
}

func insertUser(db *sql.DB, user User) {
	sqlStmt := `
	INSERT INTO users (name, email) VALUES (?, ?);
	`
	_, err := db.Exec(sqlStmt, user.Name, user.Email)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("User inserted successfully!")
}

func queryUsers(db *sql.DB) []User {
	rows, err := db.Query("SELECT id, name, email FROM users")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	var users []User
	for rows.Next() {
		var user User
		err := rows.Scan(&user.ID, &user.Name, &user.Email)
		if err != nil {
			log.Fatal(err)
		}
		users = append(users, user)
	}

	return users
}

func updateUser(db *sql.DB, user User) {
	sqlStmt := `
	UPDATE users SET name = ? WHERE id = ?;
	`
	_, err := db.Exec(sqlStmt, user.Name, user.ID)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("User updated successfully!")
}

func deleteUser(db *sql.DB, userID int) {
	sqlStmt := `
	DELETE FROM users WHERE id = ?;
	`
	_, err := db.Exec(sqlStmt, userID)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("User deleted successfully!")
}

5. 代码解释

  • main.go中,我们定义了User结构体来表示用户实体,并实现了createTableinsertUserqueryUsersupdateUserdeleteUser等函数来执行对应的CRUD操作。
  • main函数作为入口点,首先连接数据库,并创建所需的表。然后,插入一个用户记录,并查询所有用户记录。接着,我们更新用户的姓名并再次查询用户记录。最后,我们删除刚才创建的用户,并再次查询所有用户记录,以验证删除操作是否成功。

6. 运行CRUD示例

要运行这个简单的CRUD示例,只需在终端中执行以下命令:

$ go run main.go

如果一切顺利,你将会在终端看到各个操作的输出结果,并且数据库中的数据将会按照你的操作进行变化。

7. 结论

通过这个简单的Go编写CRUD示例,我深刻体会到了Go语言在数据库操作方面的简洁和高效。使用Go的标准库database/sql以及适合应用的数据库驱动,我们可以轻松地实现各种数据库操作,如插入、查询、更新和删除等。