go语言操作MySql

go语言操作MySql

1.1引入相关依赖

import (
   "database/sql"
   _ "github.com/go-sql-driver/mysql"
)

1.2使用MySql驱动

package main

import "database/sql"

func main() {
   dsn := "username:password@tcp(localhost:3306)/database_namecharset=utf8mb4"
   // 不会校验账号密码是否正确
   // 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
   db, err := sql.Open("mysql", dsn)
   if err != nil {
      return
   }
   // 尝试与数据库建立连接(校验dsn是否正确)
   err = db.Ping()
   if err != nil {
      return
   }
   defer db.Close()
}

注意:usernamepassworddatabase_name 替换为你的实际数据库用户名、密码和要创建的数据库名称。`

1.3测试MySql连接

package main

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

func main() {
	......
	defer db.Close()
	// 测试连接
	err = db.Ping()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Connected to the database")
}

1.4CRUD

1.4.1创建数据库

CREATE DATABASE IF NOT EXISTS database_name

注意: 可以在 navicat 上直接新建查询创建。

1.4.2创建表

// 创建表
func createTable(db *sql.DB) error {
  // 创建用户表
	query := `CREATE TABLE IF NOT EXISTS users (
		id INT AUTO_INCREMENT PRIMARY KEY,
		name VARCHAR(50) NOT NULL,
		age INT
	)`
	// 执行sql
	_, err := db.Exec(query)
	if err != nil {
		return err
	}
	fmt.Println("Table created successfully")
	return nil
}

1.4.3插入数据

// 插入数据
func insertData(db *sql.DB, name string, age int) error {
	query := "INSERT INTO users (name, age) VALUES (?, ?)"

	_, err := db.Exec(query, name, age)
	if err != nil {
		return err
	}
	fmt.Println("Data inserted successfully")
	return nil
}

1.4.4查询数据

// 查询数据
func queryData(db *sql.DB) (*sql.Rows, error) {
	query := "SELECT name, age FROM users"

	rows, err := db.Query(query)
	if err != nil {
		return nil, err
	}
	return rows, nil
}

1.4.5更新数据

// 更新数据
func updateData(db *sql.DB, name string, age int) error {
	query := "UPDATE users SET age = ? WHERE name = ?"

	_, err := db.Exec(query, age, name)
	if err != nil {
		return err
	}
	fmt.Println("Data updated successfully")
	return nil
}

1.4.6删除数据

// 删除数据
func deleteData(db *sql.DB, name string) error {
	query := "DELETE FROM users WHERE name = ?"

	_, err := db.Exec(query, name)
	if err != nil {
		return err
	}
	fmt.Println("Data deleted successfully")
  return nil
}

1.5完整代码示例

package main

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

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	// username、password和database_name替换为你的实际数据库用户名、密码和要创建的数据库名称
	dsn := "username:password@tcp(localhost:3306)/database_name?charset=utf8mb4"
	// 连接数据库
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

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

	// 创建表
	err = createTable(db)
	if err != nil {
		log.Fatal(err)
	}

	// 插入数据
	err = insertData(db, "倾心1", 22)
	if err != nil {
		log.Fatal(err)
	}
	err = insertData(db, "倾心2", 22)
	if err != nil {
		log.Fatal(err)
	}

	// 查询数据
	rows, err := queryData(db)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	// 遍历结果
	for rows.Next() {
		var name string
		var age int
		err := rows.Scan(&name, &age)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("Name: %s, Age: %d\n", name, age)
	}

	// 更新数据
	err = updateData(db, "倾心1", 30)
	if err != nil {
		log.Fatal(err)
	}

	// 删除数据
	err = deleteData(db, "倾心1")
	if err != nil {
		log.Fatal(err)
	}
}

// 创建表
func createTable(db *sql.DB) error {
	query := `CREATE TABLE IF NOT EXISTS users (
		id INT AUTO_INCREMENT PRIMARY KEY,
		name VARCHAR(50) NOT NULL,
		age INT
	)`

	_, err := db.Exec(query)
	if err != nil {
		return err
	}
	fmt.Println("Table created successfully")
	return nil
}

// 插入数据
func insertData(db *sql.DB, name string, age int) error {
	query := "INSERT INTO users (name, age) VALUES (?, ?)"

	_, err := db.Exec(query, name, age)
	if err != nil {
		return err
	}
	fmt.Println("Data inserted successfully")
	return nil
}

// 查询数据
func queryData(db *sql.DB) (*sql.Rows, error) {
	query := "SELECT name, age FROM users"

	rows, err := db.Query(query)
	if err != nil {
		return nil, err
	}
	return rows, nil
}

// 更新数据
func updateData(db *sql.DB, name string, age int) error {
	query := "UPDATE users SET age = ? WHERE name = ?"

	_, err := db.Exec(query, age, name)
	if err != nil {
		return err
	}
	fmt.Println("Data updated successfully")
	return nil
}

// 删除数据
func deleteData(db *sql.DB, name string) error {
	query := "DELETE FROM users WHERE name = ?"

	_, err := db.Exec(query, name)
	if err != nil {
		return err
	}
	fmt.Println("Data deleted successfully")
	return nil
}

执行go run main.go

image-20230604115746646

1.6MySql事务

1.6.1什么是事务

事务(Transaction)是数据库管理系统执行的一个操作序列,被视为一个逻辑单元,要么全部成功执行,要么全部失败回滚。

1.6.2事务的特性

  1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会部分执行。
  2. 一致性(Consistency):事务执行前后,数据库从一个一致的状态转换到另一个一致的状态。事务的执行不会破坏数据库的完整性约束。
  3. 隔离性(Isolation):并发执行的事务互不干扰,每个事务的操作在逻辑上都是独立的,不会相互影响。
  4. 持久性(Durability):事务一旦提交,其结果将永久保存在数据库中,即使发生系统故障也不会丢失。

1.6.3事务的方法

MySQL 提供了多种操作事务的方法,包括开始事务(BEGINSTART TRANSACTION)、提交事务(COMMIT)和回滚事务(ROLLBACK)等。

事务开始

func (db *DB) Begin() (*Tx, error)

提交事务

func (tx *Tx) Commit() error

回滚事务

func (tx *Tx) Rollback() error

1.6.4简单实现

package main

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

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	// 创建数据库连接
  dsn := "root:123456@tcp(localhost:3306)/database_name?charset=utf8mb4"
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 开始事务
	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}

	// 插入一条记录
	_, err = tx.Exec("INSERT INTO users (name, email) VALUES (?, ?)", "倾心3", "xxx@example.com")
	if err != nil {
    // 回滚事务
		tx.Rollback()
		log.Fatal(err)
	}

	// 更新记录的邮箱
	_, err = tx.Exec("UPDATE users SET email = ? WHERE name = ?", "new-email@example.com", "倾心3")
	if err != nil {
    // 回滚事务
		tx.Rollback()
		log.Fatal(err)
	}

	// 提交事务
	err = tx.Commit()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Transaction committed successfully")
}

在上述示例中,我们首先插入了一条记录到 users 表,然后更新了该记录的邮箱。如果任何一个操作失败,事务会被回滚,不会对数据库产生影响。只有在所有操作都成功完成后,我们才会提交事务。

注意,在实际开发中,你需要根据需要处理错误、设置适当的事务隔离级别,并根据实际情况对事务进行回滚或提交。这个示例只是一个简单的演示,以帮助你理解事务的基本概念和操作。