一文教你Go语言如何轻松使用Mysql

  • Post author:
  • Post category:mysql





Go 语言使用 MySQL 的基础操作

在本文中,我们将介绍如何在Go语言中使用database/sql包以及相关的数据库驱动程序来进行数据库连接和操作。我们将使用MySQL数据库作为示例,展示使用go-sql-driver/mysql驱动进行基本的数据库操作。



1. 安装 MySQL 驱动

首先需要安装一个支持MySQL的Go语言驱动程序。本文档将以


go-sql-driver/mysql


为例:

在你的终端或命令提示符中运行以下命令:

go get -u github.com/go-sql-driver/mysql



2. 导入相关库

在你的 Go 代码中导入导入相关库:

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

引入数据库驱动时,需要使用

_

,表示仅导入本包的初始化函数 (init),而不主动调用包内的其他函数执行。



3. 数据库连接

创建一个连接 MySQL 数据库的函数:

func dbConnect() (*sql.DB, error) {
 dsn := "username:password@tcp(localhost:3306)/dbname"
 db, err := sql.Open("mysql", dsn)
 return db, err
}



4. 创建表

创建一个用于示例的

users

表:

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)
 return err
}



5. 插入数据

创建一个函数用于向

users

表中插入数据:

func insertUser(db *sql.DB, name string, age int) (int64, error) {
 query := "INSERT INTO users (name, age) VALUES (?, ?)"
 result, err := db.Exec(query, name, age)
 if err != nil {
  return 0, err
 }
 id, err := result.LastInsertId()
 return id, err
}



6. 查询数据

创建一个函数用于从

users

表中查询数据:

type User struct {
 ID   int
 Name string
 Age  int
}

func getUsers(db *sql.DB) ([]User, error) {
 query := "SELECT id, name, age FROM users"
 rows, err := db.Query(query)
 if err != nil {
  return nil, err
 }
 defer rows.Close()

 var users []User
 for rows.Next() {
  var u User
  err := rows.Scan(&u.ID, &u.Name, &u.Age)
  if err != nil {
   return nil, err
  }
  users = append(users, u)
 }
 return users, nil
}



7. 更新数据

创建一个函数用于更新

users

表中的数据:

func updateUser(db *sql.DB, id int, name string, age int) (int64, error) {
 query := "UPDATE users SET name = ?, age = ? WHERE id = ?"
 result, err := db.Exec(query, name, age, id)
 if err != nil {
  return 0, err
 }
 affectedRows, err := result.RowsAffected()
 return affectedRows, err
}



8. 删除数据

创建一个函数用于从

users

表中删除数据:

func deleteUser(db *sql.DB, id int) (int64, error) {
 query := "DELETE FROM users WHERE id = ?"
 result, err := db.Exec(query, id)
 if err != nil {
  return 0, err
 }
 affectedRows, err := result.RowsAffected()
 return affectedRows, err
}



9. 示例

这是一个完整的示例,替换 mysqlInfo 变量中的占位符,填入实际的用户名、密码、数据库名等内容。确保您已创建名为 Employees 的表。运行这个程序,它将会对 Employees 表进行插入、更新、查询和删除操作。

package main

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

func main() {
	// 连接 MySQL 数据库
	mysqlInfo := "username:password@tcp(localhost:3306)/yourDatabase?charset=utf8"
	db, err := sql.Open("mysql", mysqlInfo)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 插入数据
	insert := "INSERT INTO Employees(first_name, last_name, age) VALUES (?, ?, ?)"
	result, err := db.Exec(insert, "Alice", "Smith", 30)
	if err != nil {
		fmt.Println("Error inserting data:", err)
	} else {
		fmt.Println("Data inserted successfully")
	}

	// 更新数据
	update := "UPDATE Employees SET age = ? WHERE first_name = ? AND last_name = ?"
	result, err = db.Exec(update, 31, "Alice", "Smith")
	if err != nil {
		fmt.Println("Error updating data:", err)
	} else {
		fmt.Println("Data updated successfully")
		rowsAffected, _ := result.RowsAffected()
		fmt.Println("Rows affected:", rowsAffected)
	}
	
	// 查询数据
	query := "SELECT * FROM Employees"
	rows, err := db.Query(query)
	if err != nil {
		fmt.Println("Error querying data:", err)
		return
	}
	defer rows.Close()

	fmt.Println("Fetching data from Employees table:")
	var id, age int
	var firstName, lastName string
	for rows.Next() {
		err := rows.Scan(&id, &firstName, &lastName, &age)
		if err != nil {
			fmt.Println("Error scanning data:", err)
		} else {
			fmt.Printf("ID: %d, Name: %s %s, Age: %d\n", id, firstName, lastName, age)
		}
	}
	
	// 删除数据
	delete := "DELETE FROM Employees WHERE first_name = ? AND last_name = ?"
	result, err = db.Exec(delete, "Alice", "Smith")
	if err != nil {
		fmt.Println("Error deleting data:", err)
	} else {
		fmt.Println("Data deleted successfully")
		rowsAffected, _ := result.RowsAffected()
		fmt.Println("Rows affected:", rowsAffected)
	}
}



版权声明:本文为weixin_59801183原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。