文章目录
- 1. 安装 MySQL 如果你本地还没有 MySQL,可以通过以下方式安装: Windows/Mac 用户:从 MySQL 官方网站 下载并安装。 Linux 用户: sudo apt install mysql-server # Debian/Ubuntu sudo yum install mysql-server # CentOS 启动 MySQL: mysql -u root -p 2. 创建测试数据库与表 登录 MySQL 后执行: CREATE DATABASE go_demo; USE go_demo; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT ); INSERT INTO users (name, age) VALUES (‘Alice’, 25), (‘Bob’, 30);
- Go 并没有内置 MySQL 驱动,需要安装第三方驱动 go-sql-driver/mysql: go get -u github.com/go-sql-driver/mysql
- main.go: package main import ( “database/sql” “fmt” “log” _ “github.com/go-sql-driver/mysql” // MySQL 驱动 ) func main() { // 1. 定义 MySQL DSN(数据源名称) dsn := “root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local” // 2. 打开数据库连接(并不会立即建立物理连接) db, err := sql.Open(“mysql”, dsn) if err != nil { log.Fatalf(“连接数据库失败: %v”, err) } defer db.Close() // 3. 测试连接是否可用 if err := db.Ping(); err != nil { log.Fatalf(“无法连接到数据库: %v”, err) } fmt.Println(“成功连接到 MySQL 数据库!”) // 4. 查询数据 rows, err := db.Query(“SELECT id, name, age FROM users”) if err != nil { log.Fatalf(“查询失败: %v”, err) } defer rows.Close() for rows.Next() { var id int var name string var age int if err := rows.Scan(&id, &name, &age); err != nil { log.Fatalf(“读取数据失败: %v”, err) } fmt.Printf(“用户ID:%d, 姓名:%s, 年龄:%dn”, id, name, age) } }
- 假设我们已经启动了 MySQL 并且数据已插入,执行: go run main.go 输出: 成功连接到 MySQL 数据库!用户ID:1, 姓名:Alice, 年龄:25用户ID:2, 姓名:Bob, 年龄:30
- 1. DSN 格式username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local parseTime=True 让 MySQL 日期类型自动解析为 time.Time。 charset=utf8mb4 支持 Emoji 等多字节字符。 2. 连接池设置 在生产环境中应设置连接池: db.SetMaxOpenConns(10) // 最大连接数 db.SetMaxIdleConns(5) // 最大空闲连接数 3. 错误处理 每次执行查询或写入操作时,都要检查 err。 小结 Go 使用 database/sql 配合 go-sql-driver/mysql 可以方便地连接 MySQL。 连接数据库的关键步骤:安装驱动 → 配置 DSN → 打开连接 → Ping 测试。 在生产环境中,要注意连接池、错误处理、以及防止 SQL 注入(使用 Prepare 或参数化查询)。
- 数据库与表 假设我们已经创建好数据库和表(go_demo 数据库中的 users 表): CREATE DATABASE go_demo; USE go_demo; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT ); 安装 MySQL 驱动 如果还没安装: go get -u github.com/go-sql-driver/mysql
- main.go: package main import ( “database/sql” “fmt” “log” _ “github.com/go-sql-driver/mysql” ) var db *sql.DB func initDB() { var err error dsn := “root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local” db, err = sql.Open(“mysql”, dsn) if err != nil { log.Fatalf(“连接数据库失败: %v”, err) } if err := db.Ping(); err != nil { log.Fatalf(“无法连接到数据库: %v”, err) } fmt.Println(“数据库连接成功!”) } // Create – 插入数据 func createUser(name string, age int) { result, err := db.Exec(“INSERT INTO users (name, age) VALUES (?, ?)”, name, age) if err != nil { log.Fatalf(“插入数据失败: %v”, err) } id, _ := result.LastInsertId() fmt.Printf(“新增用户成功,ID = %dn”, id) } // Read – 查询数据 func getUsers() { rows, err := db.Query(“SELECT id, name, age FROM users”) if err != nil { log.Fatalf(“查询失败: %v”, err) } defer rows.Close() fmt.Println(“用户列表:”) for rows.Next() { var id, age int var name string if err := rows.Scan(&id, &name, &age); err != nil { log.Fatalf(“读取数据失败: %v”, err) } fmt.Printf(“ID: %d, 姓名: %s, 年龄: %dn”, id, name, age) } } // Update – 更新数据 func updateUser(id int, newAge int) { result, err := db.Exec(“UPDATE users SET age = ? WHERE id = ?”, newAge, id) if err != nil { log.Fatalf(“更新数据失败: %v”, err) } rowsAffected, _ := result.RowsAffected() fmt.Printf(“更新完成,影响行数: %dn”, rowsAffected) } // Delete – 删除数据 func deleteUser(id int) { result, err := db.Exec(“DELETE FROM users WHERE id = ?”, id) if err != nil { log.Fatalf(“删除数据失败: %v”, err) } rowsAffected, _ := result.RowsAffected() fmt.Printf(“删除完成,影响行数: %dn”, rowsAffected) } func main() { initDB() // 增 createUser(“Alice”, 25) createUser(“Bob”, 30) // 查 getUsers() // 改 updateUser(1, 26) // 查 getUsers() // 删 deleteUser(2) // 查 getUsers() }
- 假设我们执行: go run main.go 输出可能是: 数据库连接成功!新增用户成功,ID = 1新增用户成功,ID = 2用户列表:ID: 1, 姓名: Alice, 年龄: 25ID: 2, 姓名: Bob, 年龄: 30更新完成,影响行数: 1用户列表:ID: 1, 姓名: Alice, 年龄: 26ID: 2, 姓名: Bob, 年龄: 30删除完成,影响行数: 1用户列表:ID: 1, 姓名: Alice, 年龄: 26
- 1. 参数化查询使用 ? 占位符,可以有效防止 SQL 注入。 2. 错误处理查询、更新、插入、删除时都应检查 err。 3. 连接池在生产环境中,建议配置连接池: db.SetMaxOpenConns(10) db.SetMaxIdleConns(5) 4. 事务支持如果多条 SQL 需要保证原子性,应使用 db.Begin() 开启事务。 小结 Go 使用 database/sql + MySQL 驱动可以很方便地执行 CRUD 操作。 推荐使用参数化查询,避免 SQL 注入。 在生产中,要结合事务、连接池和错误重试机制,确保数据安全性与稳定性。 到此这篇关于Go语言连接MySQL数据库执行基本的增删改查的文章就介绍到这了,更多相关Go连接MySQL执行增删改查内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Go使用Gin写一个对MySQL的增删改查的实现 Go使用Gin+mysql实现增删改查的详细实例 Go语言MySQLCURD数据库操作示例详解 go使用SQLX操作MySQL数据库的教程详解 Go语言Gin框架中使用MySQL数据库的三种方式 Go语言操作MySql数据库的详细指南
目录
- Go语言连接MySQL数据库
- 准备工作
- 安装 MySQL 驱动
- 代码实现
- 运行结果
- 注意事项
- Go语言执行基本的增删改查
- 准备工作
- 代码实现
- 运行结果
- 注意事项
在后端开发中,MySQL 是最常用的关系型数据库之一。Go 语言通过官方的 database/sql 包和 MySQL 驱动,可以方便地与 MySQL 建立连接,并执行增删改查操作。
本篇将带你从零开始,使用 Go 连接 MySQL 数据库,并验证连接是否成功。
1. 安装 MySQL
如果你本地还没有 MySQL,可以通过以下方式安装:
- Windows/Mac 用户:从 MySQL 官方网站 下载并安装。
- Linux 用户:
sudo apt install mysql-server # Debian/Ubuntu sudo yum install mysql-server # CentOS
启动 MySQL:
mysql -u root -p
2. 创建测试数据库与表
登录 MySQL 后执行:
CREATE DATABASE go_demo;
USE go_demo;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30);
Go 并没有内置 MySQL 驱动,需要安装第三方驱动 go-sql-driver/mysql:
go get -u github.com/go-sql-driver/mysql
main.go:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql" // MySQL 驱动
)
func main() {
// 1. 定义 MySQL DSN(数据源名称)
dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"
// 2. 打开数据库连接(并不会立即建立物理连接)
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
defer db.Close()
// 3. 测试连接是否可用
if err := db.Ping(); err != nil {
log.Fatalf("无法连接到数据库: %v", err)
}
fmt.Println("成功连接到 MySQL 数据库!")
// 4. 查询数据
rows, err := db.Query("SELECT id, name, age FROM users")
if err != nil {
log.Fatalf("查询失败: %v", err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var age int
if err := rows.Scan(&id, &name, &age); err != nil {
log.Fatalf("读取数据失败: %v", err)
}
fmt.Printf("用户ID:%d, 姓名:%s, 年龄:%dn", id, name, age)
}
}
假设我们已经启动了 MySQL 并且数据已插入,执行:
go run main.go
输出:
成功连接到 MySQL 数据库!
用户ID:1, 姓名:Alice, 年龄:25
用户ID:2, 姓名:Bob, 年龄:30
1. DSN 格式username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
parseTime=True让 MySQL 日期类型自动解析为time.Time。charset=utf8mb4支持 Emoji 等多字节字符。
2. 连接池设置
在生产环境中应设置连接池:
db.SetMaxOpenConns(10) // 最大连接数 db.SetMaxIdleConns(5) // 最大空闲连接数
3. 错误处理
每次执行查询或写入操作时,都要检查 err。
小结
- Go 使用
database/sql配合go-sql-driver/mysql可以方便地连接 MySQL。 - 连接数据库的关键步骤:安装驱动 → 配置 DSN → 打开连接 → Ping 测试。
- 在生产环境中,要注意连接池、错误处理、以及防止 SQL 注入(使用
Prepare或参数化查询)。
数据库与表
假设我们已经创建好数据库和表(go_demo 数据库中的 users 表):
CREATE DATABASE go_demo;
USE go_demo;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
安装 MySQL 驱动
如果还没安装:
go get -u github.com/go-sql-driver/mysql
main.go:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func initDB() {
var err error
dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err = sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
if err := db.Ping(); err != nil {
log.Fatalf("无法连接到数据库: %v", err)
}
fmt.Println("数据库连接成功!")
}
// Create - 插入数据
func createUser(name string, age int) {
result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", name, age)
if err != nil {
log.Fatalf("插入数据失败: %v", err)
}
id, _ := result.LastInsertId()
fmt.Printf("新增用户成功,ID = %dn", id)
}
// Read - 查询数据
func getUsers() {
rows, err := db.Query("SELECT id, name, age FROM users")
if err != nil {
log.Fatalf("查询失败: %v", err)
}
defer rows.Close()
fmt.Println("用户列表:")
for rows.Next() {
var id, age int
var name string
if err := rows.Scan(&id, &name, &age); err != nil {
log.Fatalf("读取数据失败: %v", err)
}
fmt.Printf("ID: %d, 姓名: %s, 年龄: %dn", id, name, age)
}
}
// Update - 更新数据
func updateUser(id int, newAge int) {
result, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", newAge, id)
if err != nil {
log.Fatalf("更新数据失败: %v", err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("更新完成,影响行数: %dn", rowsAffected)
}
// Delete - 删除数据
func deleteUser(id int) {
result, err := db.Exec("DELETE FROM users WHERE id = ?", id)
if err != nil {
log.Fatalf("删除数据失败: %v", err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("删除完成,影响行数: %dn", rowsAffected)
}
func main() {
initDB()
// 增
createUser("Alice", 25)
createUser("Bob", 30)
// 查
getUsers()
// 改
updateUser(1, 26)
// 查
getUsers()
// 删
deleteUser(2)
// 查
getUsers()
}
假设我们执行:
go run main.go
输出可能是:
数据库连接成功!
新增用户成功,ID = 1
新增用户成功,ID = 2
用户列表:
ID: 1, 姓名: Alice, 年龄: 25
ID: 2, 姓名: Bob, 年龄: 30
更新完成,影响行数: 1
用户列表:
ID: 1, 姓名: Alice, 年龄: 26
ID: 2, 姓名: Bob, 年龄: 30
删除完成,影响行数: 1
用户列表:
ID: 1, 姓名: Alice, 年龄: 26
1. 参数化查询使用 ? 占位符,可以有效防止 SQL 注入。
2. 错误处理查询、更新、插入、删除时都应检查 err。
3. 连接池在生产环境中,建议配置连接池:
db.SetMaxOpenConns(10) db.SetMaxIdleConns(5)
4. 事务支持如果多条 SQL 需要保证原子性,应使用 db.Begin() 开启事务。
小结
- Go 使用
database/sql+ MySQL 驱动可以很方便地执行 CRUD 操作。 - 推荐使用参数化查询,避免 SQL 注入。
- 在生产中,要结合事务、连接池和错误重试机制,确保数据安全性与稳定性。
到此这篇关于Go语言连接MySQL数据库执行基本的增删改查的文章就介绍到这了,更多相关Go连接MySQL执行增删改查内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Go使用Gin写一个对MySQL的增删改查的实现
- Go使用Gin+mysql实现增删改查的详细实例
- Go语言MySQLCURD数据库操作示例详解
- go使用SQLX操作MySQL数据库的教程详解
- Go语言Gin框架中使用MySQL数据库的三种方式
- Go语言操作MySql数据库的详细指南