首页 > 数据库 >golang操作mysql

golang操作mysql

时间:2023-09-07 15:46:09浏览次数:37  
标签:nil err fmt Printf db golang mysql 操作 id

golang操作mysql

在Go语言中,你可以使用第三方库来进行MySQL数据库的操作。其中,比较常用的库有database/sqlgithub.com/go-sql-driver/mysql

  • 在安装了MySQL的前提下进行以下操作

1 下载依赖

在终端执行命令:

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

2 导入依赖库

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

3 CRUD

初始化数据库

// 定义一个全局对象db
var db *sql.DB

// 定义一个初始化数据库的函数
func initDB() (err error) {
	// 不会校验账号密码是否正确
	// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
    // 确保将`username`、`password`、`host`、`port`和`database_name`替换为实际的数据库连接信息
	db, err = sql.Open("mysql", "username:password@tcp(host:port)/database_name")
	if err != nil {
		return err
	}
	// 尝试与数据库建立连接(校验dsn是否正确)
	err = db.Ping()
	if err != nil {
		return err
	}
	return nil
}

func main() {
	err := initDB() // 调用输出化数据库的函数
	if err != nil {
		fmt.Printf("init db failed,err:%v\n", err)
		return
	}
}

其中sql.DB是表示连接的数据库对象(结构体实例),它保存了连接数据库相关的所有信息。它内部维护着一个具有零到多个底层连接的连接池,它可以安全地被多个goroutine同时使用。

查询

为了方便查询,我们事先定义好一个结构体来存储user表的数据。

type user struct {
	id   int
	age  int
	name string
}

单行查询

单行查询db.QueryRow()执行一次查询,并期望返回最多一行结果(即Row)。QueryRow总是返回非nil的值,直到返回值的Scan方法被调用时,才会返回被延迟的错误。(如:未找到结果)

func (db *DB) QueryRow(query string, args ...interface{}) *Row

具体示例代码:

// 查询单条数据示例
func queryRowDemo() {
	sqlStr := "select id, name, age from user where id=?"
	var u user
	// 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
	err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name, &u.age)
	if err != nil {
		fmt.Printf("scan failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}

多行查询

多行查询db.Query()执行一次查询,返回多行结果(即Rows),一般用于执行select命令。参数args表示query中的占位参数。

func (db *DB) Query(query string, args ...interface{}) (*Rows, error)

具体示例代码:

// 查询多条数据示例
func queryMultiRowDemo() {
	sqlStr := "select id, name, age from user where id > ?"
	rows, err := db.Query(sqlStr, 0)
	if err != nil {
		fmt.Printf("query failed, err:%v\n", err)
		return
	}
	// 非常重要:关闭rows释放持有的数据库链接
	defer rows.Close()

	// 循环读取结果集中的数据
	for rows.Next() {
		var u user
		err := rows.Scan(&u.id, &u.name, &u.age)
		if err != nil {
			fmt.Printf("scan failed, err:%v\n", err)
			return
		}
		fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
	}
}

插入数据

插入、更新和删除操作都使用Exec方法。

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

Exec执行一次命令(包括查询、删除、更新、插入等),返回的Result是对已执行的SQL命令的总结。参数args表示query中的占位参数。

具体插入数据示例代码如下:

// 插入数据
func insertRowDemo() {
	sqlStr := "insert into user(name, age) values (?,?)"
	ret, err := db.Exec(sqlStr, "王五", 38)
	if err != nil {
		fmt.Printf("insert failed, err:%v\n", err)
		return
	}
	theID, err := ret.LastInsertId() // 新插入数据的id
	if err != nil {
		fmt.Printf("get lastinsert ID failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert success, the id is %d.\n", theID)
}

更新数据

具体更新数据示例代码如下:

// 更新数据
func updateRowDemo() {
	sqlStr := "update user set age=? where id = ?"
	ret, err := db.Exec(sqlStr, 39, 3)
	if err != nil {
		fmt.Printf("update failed, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("update success, affected rows:%d\n", n)
}

删除数据

具体删除数据的示例代码如下:

// 删除数据
func deleteRowDemo() {
	sqlStr := "delete from user where id = ?"
	ret, err := db.Exec(sqlStr, 3)
	if err != nil {
		fmt.Printf("delete failed, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("delete success, affected rows:%d\n", n)
}

标签:nil,err,fmt,Printf,db,golang,mysql,操作,id
From: https://www.cnblogs.com/xiufanivan/p/17685110.html

相关文章

  • Mysql 数据库的数据大小查看
    Mysql数据库的数据大小查看:1、进入information_schema数据库(存放了其他的数据库的信息)mysql->useinformation_schema;2、查询所有数据的大小:mysql->selectconcat(round(sum(data_length/1024/1024),2),'MB')asdatafromtables;3、查看指定数据库的大小:比如查看数据库h......
  • MySQL数据库基础与实战应用
    ......
  • Ubentu 16.04.2 LTS安装mysql,jdk1.8
    一、网络设置1、网络设置sudovim/etc/network/interfaces文件中写入以下内容,写完后wq保存退出。#设置网卡名称autoeth0#设置静态IP,如果是使用自动IP用dhcp,后面的不用设置ifaceeth0inetstatic#设置IP地址addressxxx.xxx.xxx.xxx#设置子网掩码netmaskxxx.xxx.xxx.......
  • 【Redis】Could not create server TCP listening socket __6379_ bind_ 在一个非套接
    问题描述:安装Redis,redis-server无法启动,报错。[34420]20Aug21:43:21.110#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo[34420]20Aug21:43:21.110#Redisversion=5.0.14.1,bits=64,commit=ec77f72d,modified=0,pid=34420,juststarted[34420]20Aug21:43:21.1......
  • 从MySQL全库备份中恢复某个库和某张表的方法
    一定要使用测试库操作一、全库备份恢复单个库的数据流程:1.第一种方法:--从全备中导出所需库的建库语句和INSERT语句。sed-n'/^--CurrentDatabase:`库名`/,/^--CurrentDatabase:`/p'全备.sql>test.sql--导入库,会自动建库mysql库名<test.sql2.另一种方法:mysql......
  • Linux系统安装jdk;tomcat;mysql。
    1安装jdk1:下载jdklinux环境jdk-8u161-linux-x64.tar.gz2:把下载好的软件放在linux系统中3:解压:tar-zxvfjdkXXXXX.tar.gz4:重命名:mvjdk1.8.0_161/jdk85:配置环境变量/etc/profile---->配置环境变量6:刷新/etc/profile文件source/etc/profile7:在任何目录输......
  • 使用JS,IE提示:由于出现错误 80020101 而导致此项操作
    消息:由于出现错误80020101而导致此项操作无法完成。行:7字符:36748代码:0URI:http://localhost:3760/Ext_Demo/ext/ext-all.js问题原因:这个错误通常是在执行某些语句时,相应的引用文件还没有加载到浏览器,导致无法执行。可以检查一下加载顺序的问题(引用或者iframe)和执行权限......
  • 【mysql】mysql判断某一张表是否存在的sql语句以及方法
    有四种方式进行判断: 1.--百分号中间为需要查询的表名SHOWTABLESLIKE‘%user%’;2. --dbname为数据库名字tablename为你需要查询的表名称,注意使用TEMPORARY关键字创建出来的临时表无法查询出来。selectTABLE_NAMEfromINFORMATION_SCHEMA.TABLESwhereTABL......
  • 【mysql】mysql分表分库
     MySQL按日期分表sql语句创建+XORM基于XORM框架实现分表MySQL数据库按时间分表的查询方法Mysqlunion与unionall究竟怎么用?到底有什么区别 #gorm分库分表https://gitee.com/lemontree/gorm-shardinghttps://blog.csdn.net/wyhstars/article/details/80609652http......
  • 软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
    简介在数据库中,我们常常需要从表中筛选出符合特定条件的数据,以便满足业务需求或获取有用的信息。MySQL提供了WHERE条件查询,使我们能够轻松地筛选数据。本文将详细介绍MySQLWHERE条件查询的用法和示例,帮助大家更好地理解和应用这一功能。WHERE条件查询的基本语法SELECT列1,列2,.......