golang mysql curd_Go 语言操作 MySQL 之 CURD 操作

本文转载于SegmentFault社区

作者:Meng小羽

MySQL 是目前开发中最常见的关系型数据库,使用 Go 语言进行操控数据库需要使用 Go 自带database/sql和驱动go-sql-driver/mysql来实现。

创建好 Go 项目,需要引用驱动依赖:go get -u github.com/go-sql-driver/mysql

使用 MySQL 驱动:func Open(driverName, dataSourceName string) (*DB, error)

Open 打开一个 dirverName 指定的数据库,dataSourceName 指定数据源,一般至少包括数据库文件名和其它连接必要的信息。

初始化连接

var db *sql.DB //声明一个全局的 db 变量// 初始化 MySQL 函数func initMySQL() (err error) {dsn := "root:password@tcp(127.0.0.1:3306)/dbname"db, err = sql.Open("mysql", dsn)if err != nil {return}err = db.Ping()if err != nil {return}return}func main() {// 初始化 MySQLerr := initMySQL()if err != nil {panic(err)}defer db.Close()}

初始化连接 MySQL 后需要借助 db.Ping 函数来判断连接是否成功。

SetMaxOpenConnsfunc (db *DB) SetMaxOpenConns(n int)

SetMaxOpenConns设置与数据库建立连接的最大数目。

如果 n 大于 0 且小于最大闲置连接数,会将最大闲置连接数减小到匹配最大开启连接数的限制。

如果 n <= 0,不会限制最大开启连接数,默认为0(无限制)。

SetMaxIdleConnsfunc (db *DB) SetMaxIdleConns(n int)

SetMaxIdleConns设置连接池中的最大闲置连接数。

如果 n 大于最大开启连接数,则新的最大闲置连接数会减小到匹配最大开启连接数的限制。

如果 n <= 0,不会保留闲置连接。

CURD

进行 CURD 操作,需要对数据库建立连接,同时有供操作的数据(数据库与数据表):

初始化数据

建立数据库 sql_demoCREATE DATABASE sql_demo;USE sql_demo;

创建数据表 userCREATE TABLE `user` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) DEFAULT "",`age` INT(11) DEFAULT "0",PRIMARY KEY(`id`))ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

查询 SELECT

便于接收数据,定义一个 user 结构体接收数据:type user struct {id intage intname string}

查询一行数据

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

实例代码如下:// 查询一行数据func queryRowDemo() (u1 *user, err error) {// 声明查询语句sqlStr := "SELECT id,name,age FROM user WHERE id = ?"// 声明一个 user 类型的变量var u user// 执行查询并且扫描至 uerr = db.QueryRow(sqlStr, 1).Scan(&u.id, &u.age, &u.name)if err != nil {return nil, err}u1 = &ureturn}func main() {// 初始化 MySQLerr := initMySQL()if err != nil {panic(err)}defer db.Close()u1, err := queryRowDemo()if err != nil {fmt.Printf("err:%s", err)}fmt.Printf("id:%d, age:%d, name:%s\n", u1.id, u1.age, u1.name)」

结果如下:id:1, age:111, name:22

多行查询

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 data failed,err:%s\n", err)return}// 查询完数据后需要进行关闭数据库链接defer rows.Close()for rows.Next() {var u usererr := rows.Scan(&u.id, &u.age, &u.name)if err != nil {fmt.Printf("scan data failed, err:%v\n", err)return}fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)}}

执行结果:id:1 name:111 age:22id:3 name:张三 age:22

使用 rows.Next() 循环读取结果集中的数据。

增加数据 INSERT

增加、删除、更新操作均使用 Exec 方法。func (db *DB) Exec(query string, args ...interface{}) (Result, error)

实例代码如下:// 增加一行数据func insertRowDemo() {sqlStr := "INSERT INTO user(name, age) VALUES(?, ?)"result, err := db.Exec(sqlStr, "小羽", 22)if err != nil {fmt.Printf("insert data failed, err:%v\n", err)return}id, err := result.LastInsertId()if err != nil {fmt.Printf("get insert lastInsertId failed, err:%v\n", err)return}fmt.Printf("insert success, id:%d\n", id)}

执行结果:insert success, id:4

更新数据 UPDATE// 更新一组数据func updateRowDemo() {sqlStr := "UPDATE user SET age = ? WHERE id = ?"result, err := db.Exec(sqlStr, 22, 1)if err != nil {fmt.Printf("update data failed, err:%v\n", err)return}n, err := result.RowsAffected()if err != nil {fmt.Printf("get rowsaffected failed, err:%v\n", err)return}fmt.Printf("update success, affected rows:%d\n", n)}

删除数据 DELETE// 删除一行数据func deleteRowDemo() {sqlStr := "DELETE FROM user WHERE id = ?"result, err := db.Exec(sqlStr, 2)if err != nil {fmt.Printf("delete data failed, err:%d\n", err)return}n, err := result.RowsAffected()if err != nil {fmt.Printf("get affected failed, err:%v\n", err)return}fmt.Printf("delete success, affected rows:%d\n", n)}

参考(学习)文章:Go语言操作MySQL

https://www.liwenzhou.com/posts/Go/go_mysql/- END -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02.1-元素定位(find)

常用的一些方法 一、导包 from selenium import webdriver二、打开火狐&#xff08;空白页&#xff09; b webdriver.Firefox()三、跳转到指定的网站 b.get(https://www.baidu.com/)四、将浏览器页面最大化 b.maximize_window()五、通过F12可查看当前的贴吧为超链接形式 …

快速傅里叶变换(FFT)——按时间抽取DIT的基

目录【1】前言1、DIF计算量2、利用性质改善【2】公式推导1、N 到 2*N/2a、分解原序列b、分解后的DFT变换c、一系列化简操作之后d、蝶形信号流e、计算量总结2、N/2 到 2*N/4a、分解X2(k)序列b、蝶形信号流&#xff08;2列&#xff09;3、N/4 到 2*N/8a、蝶形信号流&#xff08;3…

Python字符串| 带示例的format()方法

String.format()方法 (String.format() Method) format() method is used to format the string (in other words - we can say to achieve the functionality like printf() in C language). format()方法用于格式化字符串(换句话说&#xff0c;我们可以说实现了C语言中类似于…

PLSQL Developer使用技巧

1、PL/SQL Developer记住登陆密码在使用PL/SQL Developer时&#xff0c;为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码&#xff1b;设置方法&#xff1a;PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History &#xff0c; “St…

3月份的总结

租房子找了个黑中介&#xff0c;各种扣钱&#xff0c;合租的违约了&#xff0c;押金不要了直接一走了之&#xff0c;水费我们承担&#xff0c;中介这会儿又把责任推得一干二净&#xff0c;还耍小聪明&#xff0c;非说我是两个人住的&#xff0c;各种费用要交两份。。。我一时气…

快速傅里叶变换(FFT)——按频率抽取DIF的基

目录【1】回顾DIT【2】算法原理【3】运算特点【1】回顾DIT https://blog.csdn.net/qq_42604176/article/details/105559756 【2】算法原理 设序列点数&#xff1a;N2^M,M为正整数。将输入序列按照前一半、后一半分开。&#xff08;并非按照奇偶分&#xff09; 由于&#xf…

02.2-元素定位(XPath)

XML路径语言用来确定XML文档中某部分位置的语言XPath用于在XML文档中通过元素和属性进行导航XPath遵守W3C标准XPath节点类型&#xff1a; 元素、属性、文本、命名空间、指令处理、注释、文档 通过路径表达式从XML文档中选取节点或节点设置 表达式结果说明/xxx选取根节点xxx/xx…

android ImageView 之 android:scaleTye=

原文&#xff1a;http://juliaailse.iteye.com/blog/1409317 1、scaleType“matrix” 是保持原图大小、从左上角的点开始&#xff0c;以矩阵形式绘图。 2、scaleType“fitXY” 是将原图进行横方向&#xff08;即XY方向&#xff09;的拉伸后绘制的。 3、scaleType“fitStart…

acquire方法_Python锁类| 带有示例的acquire()方法

acquire方法Python Lock.acquire()方法 (Python Lock.acquire() Method) acquire() is an inbuilt method of the Lock class of the threading module in Python. acquisition()是Python中线程模块的Lock类的内置方法。 This method is used to acquire a lock, either block…

VSS2008 安装silverlight3.0步骤

需要的Q我359273753 我是新手不知道在哪里上传附件 汗一个转载于:https://www.cnblogs.com/ganler1988/archive/2011/03/17/1987367.html

php字符串对象,PHP字符串到对象名称

好的我有一个字符串……$a_string "Product";我想在调用这样的对象时使用这个字符串&#xff1a;$this->$a_string->some_function();狄更斯如何动态调用该对象&#xff1f;(不要以为我在PHP 5心中)解决方法:所以你要使用的代码是&#xff1a;$a_string &quo…

莫比乌斯函数---C++

【问题描述】 莫比乌斯函数&#xff0c;数论函数&#xff0c;由德国数学家和天文学家莫比乌斯(Mobius&#xff0c;1790-1868)提出。梅滕斯(Mertens)首先使用μ(n)作为莫比乌斯函数的记号。而据说&#xff0c;高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数。莫比乌斯函数在数…

Opencv——findContours函数再探(由轮廓联想连通域)

目录关于调参的一些思考分析图像的一些角度面积、周长、矩形度、圆形度、宽长比例1&#xff1a;找出汽车轮毂圆孔&#xff08;从轮廓和连通域两个角度&#xff09;例2&#xff1a;找出芯片中间正方形物体例3&#xff1a;桌面上橘色物体总结关于调参的一些思考 合理的参数设置&…

stl vector 函数_vector :: crend()函数以及C ++ STL中的示例

stl vector 函数C vector :: crend()函数 (C vector::crend() function) vector::crend() is a library function of "vector" header, it is used to get the first element of a vector from reverse ending, it returns a const reverse iterator pointing to th…

.Net DateTime.ToString 格式化输出 (转载)

原文 虽然 System.DateTime 本身已经具有了不少现成的格式化输出&#xff0c;例如&#xff1a; ToLongDateString, ToShortTimeString, ToUniversalTime 等&#xff0c;但是却远远不能满足我们实际的需要&#xff0c;这就要用到了 DateTime.ToString&#xff0c;就要提到 DateT…

modelsim 编译 xilinx库

1.为单个工程加入库 在某一个目录建立工程 然后 vlib unisim vcom -work unsim *.vhd 然后就加入了unisim库 如果是windows的话&#xff0c;工程文件mpf应该是记录了这个库的信息&#xff0c;所以重新打开这个工程时&#xff0c;依然有这个库 linux&#xff0c;不用gui界面…

php 字符串匹配 like,ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法...

搜索热词ThinkPHP的数据库条件查询语句有字符串式&#xff0c;数组式书写方法字符串式即是原生式&#xff0c;数组式查询语句因书写方式与特定字符的原因比较复杂&#xff0c;下面为大家例出了常用的ThinkPHP数组式查询语句的使用方法ThinkPHP一般查询$data_gt[id]array(gt,8);…

C++---汉明距离

两个整数之间的汉明距离指的是这两个数对应二进制位不同的位置的数目。 【输入形式】 给出两个整数x和y(0<x,y<2^31)&#xff0c;用空格分隔 【输出形式】 输出他们之间的汉明距离 【样例输出】 1 4 【样例说明】 00000000 00000000 00000000 00000001 00000000 00000000…

Opencv基础画图函数——line、circle、rectangle、Rect、ellipse、polylines、putText函数的用法

目录1、line函数2、circle函数3、rectangle、Rect函数4、ellipse函数5、polylines函数6、随机初始化颜色7、putText函数总结1、line函数 line(img,(0,0),(511,511),(255,0,0),5)这个函数有5个参数&#xff0c;img是图像名称&#xff0c;起点坐标&#xff0c;终点坐标&#xff…

GCC 里面的一些命令

记录一下常用GCC 相关的命令和参数 ldd ---> print share library dependenciy LD_LIBRARY_PATH---> environment variable, it will search the path accord to this variable. Also check the ldd to verify this environmental variable ldconfig-----> configure…