golang访问mysql数据库,增删改查

本文详细介绍如何使用Go语言中的sqlx和go-sql-driver/mysql包进行MySQL数据库的增删改查操作,包括创建数据库实例、执行SQL语句、插入、更新、查询数据等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要的第三方包:

go get github.com/jmoiron/sqlx
go get github.com/go-sql-driver/mysql

主要API:

  • sqlx.Open (driverName, dataSourceName string) (*DB, error)
    – driverName : 数据库类型
    – dataSourceName : 数据库信息
    – 返回一个数据库实例和错误

  • func (db *DB) Exec(query string, args …interface{}) (Result, error)
    可以直接执行 增删改 操作

  • func (db *DB) Select(dest interface{}, query string, args …interface{}) error
    查询操作函数

建表语句:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=163 DEFAULT CHARSET=latin1;

代码:

package main

import (
	"github.com/jmoiron/sqlx"
	_"github.com/go-sql-driver/mysql" //_ 代表初始化这个库
	"fmt"
	"strconv"
)

//结构体变量首字母大写,以便外部可修改成员变量
type person struct {
	Name string `db "name"`
	Age int `db "age"`
	Id int `db "id"`
}


func handleError(e error,msg string){
	if (e != nil){
		fmt.Println(e,msg)
	}
}
func main() {
	var ps []person
	db,err:=sqlx.Open("mysql","root:root@/web")
	handleError(err,"sqlx")
	defer db.Close()
	//删除表数据
	db.Exec("delete from person")
	var last_id int64

	//insert 数据
	for i:= 0; i< 10 ;i++  {
		rst,_ := db.Exec(`insert into person (name ,age) values (? ,?)`, "zhangsan_"+strconv.Itoa(i+20), 20+i)
		a_num, _ := rst.RowsAffected()
		last_id, _ = rst.LastInsertId()
		fmt.Println("影响的行数:",a_num,"最后一条记录的id为:",last_id)
	}

	//修改数据
	db.Exec(`update person set name = "lisi" where id=?`, last_id)
	//查询数据
	db.Select(&ps,"select name ,age,id from person")

	for _,unit_ps := range ps{
		fmt.Printf("name: %s,age: %d,Id :%d\n",unit_ps.Name,unit_ps.Age,unit_ps.Id)
	}

输出:

影响的行数: 1 最后一条记录的id为: 153
影响的行数: 1 最后一条记录的id为: 154
影响的行数: 1 最后一条记录的id为: 155
影响的行数: 1 最后一条记录的id为: 156
影响的行数: 1 最后一条记录的id为: 157
影响的行数: 1 最后一条记录的id为: 158
影响的行数: 1 最后一条记录的id为: 159
影响的行数: 1 最后一条记录的id为: 160
影响的行数: 1 最后一条记录的id为: 161
影响的行数: 1 最后一条记录的id为: 162
name: zhangsan_20,age: 20,Id :153
name: zhangsan_21,age: 21,Id :154
name: zhangsan_22,age: 22,Id :155
name: zhangsan_23,age: 23,Id :156
name: zhangsan_24,age: 24,Id :157
name: zhangsan_25,age: 25,Id :158
name: zhangsan_26,age: 26,Id :159
name: zhangsan_27,age: 27,Id :160
name: zhangsan_28,age: 28,Id :161
name: lisi,age: 29,Id :162
<think>好的,用户让我用Golang代码写一个MySQL增删改查示例。首先,我得确认用户的需求是什么。他们可能刚开始学习Golang,或者想了解如何用Golang操作数据库。需要提供一个简单明了的例子,涵盖基本的CRUD操作。 首先,我需要考虑如何连接MySQLGolang中常用的驱动是database/sql包配合具体的驱动,比如go-sql-driver/mysql。用户可能不知道需要先导入这个驱动,所以得提醒他们安装。 然后,建立数据库连接。代码结构通常是先导入必要的包,然后使用sql.Open()函数,参数是数据源名称。需要说明DSN的格式,比如用户名、密码、地址、数据库名和参数。 接下来是创建。用户可能已经有了,但为了示例完整,应该包含创建的语句,比如CREATE TABLE IF NOT EXISTS。这样他们可以直接运行代码而不会出错。 然后是插入数据的例子。使用Exec方法执行INSERT语句,可能需要处理自增ID的获取。这里需要注意错误处理,每个操作后都要检查错误,给出提示。 查询部分,使用Query或QueryRow,然后扫描结果到结构体或者变量中。需要展示如何遍历多行结果,使用rows.Next()循环。 更新和删除操作也是类似的,用Exec执行语句,处理返回的结果和错误。需要提醒用户注意WHERE条件,避免全更新或删除。 最后,整合所有步骤,展示一个完整的示例代码。同时需要指出可能需要注意的地方,比如关闭连接、SQL注入的问题(虽然这里用参数化查询避免了),以及错误处理的重要性。 可能用户对预处理语句不太熟悉,但示例中已经用了参数化,所以可以不用深入。另外,需要确保代码的简洁性,方便用户理解。可能还需要提到数据库驱动的注册,用匿名导入的方式,因为很多新手可能会忽略这一点。 总结一下,步骤是:安装驱动、连接数据库、建增删改查操作、关闭资源。每个部分都要用注释说明,代码结构清晰。最后检查代码是否有明显错误,比如拼写错误,或者DSN格式是否正确。以下</think>是一个使用 Go 语言实现 MySQL 增删改查(CRUD)的示例代码,包含详细注释说明: ```go package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" // 导入 MySQL 驱动 ) // 定义用户结构体 type User struct { ID int Name string Age int } var db *sql.DB func main() { // 初始化数据库连接 err := initDB() if err != nil { log.Fatal(err) } defer db.Close() // 创建用户 id, err := createUser("张三", 25) if err != nil { log.Fatal(err) } fmt.Printf("创建用户ID: %d\n", id) // 查询用户 user, err := getUser(id) if err != nil { log.Fatal(err) } fmt.Printf("查询用户: %+v\n", user) // 更新用户 rowsAffected, err := updateUser(id, "李四", 30) if err != nil { log.Fatal(err) } fmt.Printf("更新影响行数: %d\n", rowsAffected) // 删除用户 rowsAffected, err = deleteUser(id) if err != nil { log.Fatal(err) } fmt.Printf("删除影响行数: %d\n", rowsAffected) } // 初始化数据库连接 func initDB() error { var err error // 格式:用户名:密码@tcp(地址:端口)/数据库名?参数 dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True" db, err = sql.Open("mysql", dsn) if err != nil { return err } // 测试连接是否成功 err = db.Ping() if err != nil { return err } // 创建用户 createTableSQL := ` CREATE TABLE IF NOT EXISTS users( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT NOT NULL )` _, err = db.Exec(createTableSQL) return err } // 创建用户 func createUser(name string, age int) (int64, error) { result, err := db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", name, age) if err != nil { return 0, err } return result.LastInsertId() // 返回插入的ID } // 查询单个用户 func getUser(id int64) (*User, error) { user := &User{} err := db.QueryRow("SELECT id, name, age FROM users WHERE id = ?", id). Scan(&user.ID, &user.Name, &user.Age) if err != nil { return nil, err } return user, nil } // 更新用户 func updateUser(id int64, newName string, newAge int) (int64, error) { result, err := db.Exec("UPDATE users SET name = ?, age = ? WHERE id = ?", newName, newAge, id) if err != nil { return 0, err } return result.RowsAffected() // 返回影响行数 } // 删除用户 func deleteUser(id int64) (int64, error) { result, err := db.Exec("DELETE FROM users WHERE id = ?", id) if err != nil { return 0, err } return result.RowsAffected() } ``` 使用说明: 1. 需要先安装 MySQL 驱动: ```bash go get -u github.com/go-sql-driver/mysql ``` 2. 需要提前创建数据库(示例中使用 `testdb`): ```sql CREATE DATABASE testdb; ``` 3. 代码中的连接参数需要根据实际情况修改: ```go dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True" ``` 代码特点: - 使用标准库 `database/sql` - 参数化查询防止 SQL 注入 - 包含完整的 CRUD 操作 - 使用结构体映射数据 - 包含错误处理 - 自动创建数据 注意事项: 1. 确保 MySQL 服务已启动 2. 数据库用户需要有相应权限 3. 生产环境需要添加更完善的错误处理 4. 建议使用连接池配置(代码中 `db.SetMaxOpenConns()` 等) 5. 复杂查询可以使用 sqlx 等扩展库简化操作 这个示例展示了基本的数据库操作流程,实际开发中可以根据需要添加事务处理、预处理语句等高级功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值