Mysql+Go 预处理和事务

Mysql预处理和事务

golang

Mysql预处理和数据库事务相结合,并用uuid作唯一标识。

package main

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

	_ "github.com/go-sql-driver/mysql"
	"github.com/google/uuid" // 使用第三方库来生成 UUID
)

type Student struct {
	ID   string // 使用 string 类型存储 UUID
	Name string
	Age  int
}

func main() {
	db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	err = performOperations(db)
	if err != nil {
		log.Fatal(err)
	}
}

func performOperations(db *sql.DB) error {
	tx, err := db.Begin()
	if err != nil {
		return err
	}
	defer func() {
		if err != nil {
			tx.Rollback()
			return
		}
		err = tx.Commit()
	}()

	// 生成 UUID
	studentID := uuid.New().String()

	err = insertStudent(tx, studentID, "John Doe", 25)
	if err != nil {
		return err
	}

	err = updateStudentAge(tx, studentID, 26)
	if err != nil {
		return err
	}

	student, err := queryStudent(tx, studentID)
	if err != nil {
		return err
	}
	fmt.Printf("Student ID: %s, Name: %s, Age: %d\n", student.ID, student.Name, student.Age)

	err = deleteStudent(tx, studentID)
	if err != nil {
		return err
	}

	return nil
}

func insertStudent(tx *sql.Tx, id string, name string, age int) error {
	insertStmt, err := tx.Prepare("INSERT INTO students(id, name, age) VALUES(?, ?, ?)")
	if err != nil {
		return err
	}
	defer insertStmt.Close()

	_, err = insertStmt.Exec(id, name, age)
	if err != nil {
		return err
	}

	fmt.Printf("Inserted row with ID %s\n", id)

	return nil
}

func updateStudentAge(tx *sql.Tx, id string, newAge int) error {
	updateStmt, err := tx.Prepare("UPDATE students SET age=? WHERE id=?")
	if err != nil {
		return err
	}
	defer updateStmt.Close()

	_, err = updateStmt.Exec(newAge, id)
	if err != nil {
		return err
	}
	fmt.Printf("Updated age for student with ID %s\n", id)

	return nil
}

func queryStudent(tx *sql.Tx, id string) (Student, error) {
	queryStmt, err := tx.Prepare("SELECT id, name, age FROM students WHERE id=?")
	if err != nil {
		return Student{}, err
	}
	defer queryStmt.Close()

	var student Student
	err = queryStmt.QueryRow(id).Scan(&student.ID, &student.Name, &student.Age)
	if err != nil {
		return Student{}, err
	}

	return student, nil
}

func deleteStudent(tx *sql.Tx, id string) error {
	deleteStmt, err := tx.Prepare("DELETE FROM students WHERE id=?")
	if err != nil {
		return err
	}
	defer deleteStmt.Close()

	_, err = deleteStmt.Exec(id)
	if err != nil {
		return err
	}
	fmt.Printf("Deleted student with ID %s\n", id)

	return nil
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

席万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值