go使用mysql实现增删改查操作

1、安装MySQL驱动

bash 复制代码
go get -u github.com/go-sql-driver/mysql

2、go连接MySQL

go 复制代码
import (
	"database/sql"
	"log"

	_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动
)

type Users struct {
	ID    int
	Name  string
	Email string
}

var db *sql.DB

func init() {
	// 打开或创建一个 SQLite 数据库文件
	var err error
	db, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?parseTime=true")
	if err != nil {
		log.Fatal(err)
	}
	// 测试连接
	if err = db.Ping(); err != nil {
		log.Fatal(err)
	}
	// 创建用户表
	createTableSQL := `
	CREATE TABLE IF NOT EXISTS users (
		id INT AUTO_INCREMENT PRIMARY KEY,
		name varchar(64) NOT NULL,
		email varchar(64) NOT NULL UNIQUE
	);
	`
	// 执行 SQL 语句
	_, err = db.Exec(createTableSQL)
	if err != nil {
		log.Fatal(err)
	}
}

3、users表增删改查SQL

go 复制代码
// 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()
}

4、操作增删改查操作

go 复制代码
// 创建用户
user := &Users{Name: "buddha", Email: "[email protected]"}
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 = "[email protected]"
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)

整体测试代码如下:

go 复制代码
// main.go
package main

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

	_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动
)

type Users struct {
	ID    int
	Name  string
	Email string
}

var db *sql.DB

func init() {
	// 打开或创建一个 SQLite 数据库文件
	var err error
	db, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?parseTime=true")
	if err != nil {
		log.Fatal(err)
	}
	// 测试连接
	if err = db.Ping(); err != nil {
		log.Fatal(err)
	}
	// 创建用户表
	createTableSQL := `
	CREATE TABLE IF NOT EXISTS users (
		id INT AUTO_INCREMENT PRIMARY KEY,
		name varchar(64) NOT NULL,
		email varchar(64) 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: "[email protected]"}
	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 = "[email protected]"
	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函数结束...")
}
相关推荐
伍六星7 分钟前
更新Java的环境变量后VScode/cursor里面还是之前的环境变量
java·开发语言·vscode
Dola_Pan10 分钟前
Android四大组件通讯指南:Kotlin版组件茶话会
android·开发语言·kotlin
万能程序员-传康Kk22 分钟前
智能教育个性化学习平台-java
java·开发语言·学习
道剑剑非道26 分钟前
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
开发语言·qt·ffmpeg
@残梦32 分钟前
129、QT搭建FFmpeg环境
开发语言·qt·ffmpeg
秃了也弱了。34 分钟前
DBSyncer:开源数据库同步利器,MySQL/Oracle/ES/SqlServer/PG/
数据库·mysql·开源
序属秋秋秋1 小时前
《C++初阶之类和对象》【命名空间 + 输入&输出 + 缺省参数 + 函数重载】
开发语言·c++·笔记
C_Liu_1 小时前
C语言:数据在内存中的存储
c语言·开发语言
武子康1 小时前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
喜欢踢足球的老罗1 小时前
使用 Spring Boot 3.3 和 JdbcTemplate 操作 MySQL 数据库
数据库·spring boot·mysql