范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Go学习(二十五)操作MYSQL,实现CRUD

  1.介绍
  Go 官方提供了database 包,database 包下有sql/driver 。该包用来定义操作数据库的接口,这保证了无论使用哪种数据库,操作方式都是相同的。但Go 官方并没有提供连接数据库的driver ,如果要操作数据库,还需要第三方的driver 包。2.下载安装驱动
  go-sql-driver 驱动源码地址: https://github.com/go-sql-driver/mysql2.1 安装驱动go get -u github.com/go-sql-driver/mysql 3.匿名导入
  通常来说,导入包后就能调用该包中的数据和方法。但是对于数据库操作来说,不应该直接使用导入驱动包所提供的方法,而应该使用  sql.DB 对象所提供的统一的方法。因此在导入MySQL 驱动时,使用了匿名导入包的方式。
  匿名导入包: 只导入包但是不使用包内的类型和数据,使用匿名的方式: 在包路径前添加下画线  _  import (  _ "github.com/go-sql-driver/mysql" )
  在导入一个数据库驱动后,该驱动会自行初始化并注册到 Go 的database/sql上 下文中,这样就可以通过 database/sql 包所提供的方法来访问数据库了。4.连接数据库4.1 连接方法
  使用 sql 包中的Open() 函数来连接数据库。Open(driverName, dataSourceName string) (*DB, error) driverName : 使用的驱动名,如mysql 。(注册到 database/sql 时所使用的名字)dataSourceName :数据库连接信息,格式:[用户名:密码@tcp(IP:port)/数据库?charset=utf8 ],例如:root:123456@tcp(127.0.0.1:3306)/test?charset=utf8 4.2 sql.DB作用sql.Open() 返回的sql.DB 对象是Goroutine 并发安全的。sql.DB  通过数据库驱动为开发者提供管理底层数据库连接的打开和关闭操作。sql.DB  帮助开发者管理数据库连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果开发者没有把连接释放回连接池,会导致过多连接使系统资源耗尽。 4.3 sql.DB设计目标
  sql.DB 的设计目标就是作为长连接(一次连接多次数据交互)使用,不宜频繁开关。比较好的做法是,为每个不同的datastore 建一个DB 对象,保持这些对象打开。如果需要短连接(一次连接一次数据交互),就把DB 作为参数传入function ,而不要在function 中开关。5.写操作(增、删、改)5.1 执行步骤先使用 预编译语句(PreparedStatement) 来拼接sql 。然后调用 db.Exec() 执行SQL ,返回执行结果5.2 代码示例package main  import (  "database/sql"  "fmt"  _ "github.com/go-sql-driver/mysql"  "time" ) func main() {  // 连接数据库  open, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8")  checkError(err)   //插入数据  //add(open)  // 更新数据  //update(open)  // 删除数据  del(open) } //插入数据 func add(open *sql.DB)  {  //插入数据  prepare, err := open.Prepare("insert user set username=?,password=?,mobile=?,createtime=?")  checkError(err)  exec, err := prepare.Exec("李四", "123456", "17600000000", time.Now().Unix())  checkError(err)  id, err := exec.LastInsertId()  checkError(err)  fmt.Printf("插入数据ID: %d  ",id) } // 更新 func update(open *sql.DB)  {  prepare, err := open.Prepare("update user set username=? where id =?")  checkError(err)  exec, err := prepare.Exec("王五", "18")  checkError(err)  rows, err := exec.RowsAffected()  checkError(err)  fmt.Printf("更新数据成功,影响条数 %d  ",rows) } // 删除数据 func del(open *sql.DB)  {  prepare, err := open.Prepare("delete from user  where id =?")  checkError(err)  exec, err := prepare.Exec( "8")  checkError(err)  rows, err := exec.RowsAffected()  checkError(err)  fmt.Printf("删除数据成功,影响条数 %d  ",rows) } //检测错误 func checkError(err error)  {  if err != nil {   panic("操作失败:"+err.Error())  } } 6. 读操作(查询)6.1 执行步骤1. 查询多条步骤调用 db.Query() 方法执行SQL 语句,返回一个Rows 查询结果。将 rows.Next() 方法的返回值作为for 循环的条件,迭代查询数据。在循环中,通过  rows.Scan() 方法读取每一行数据。调用 db.Close() 关闭查询。2.查询单条步骤调用 db.QueryRow() 方法执行SQL 语句,返回一个Row 查询结果。然后调用 row.Scan() 读取数据。6.2 代码示例package main import (  "database/sql"  "fmt"  _ "github.com/go-sql-driver/mysql" ) func main() {  // 连接数据库  db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/nsbd_app?charset=utf8")  checkError(err)  //查询多条数据  rows := queryRows(db)  fmt.Printf("多条返回:  %+v ",rows)  // 查询单条数据  row := queryRow(db)  fmt.Printf("单条返回:  %+v ",row) }  // 创建表的映射对象 type User struct {  Uid        int  UserName   string  CreateTime int  Birthday   sql.NullString //有的值可能为NULL }  //查询多条数据 func queryRows(db *sql.DB) []User {  stmt, err := db.Prepare("select id,username,createtime,birthday from nsbd_user where id < ?")  checkError(err)  rows, err := stmt.Query(30)  // 延迟关闭  defer rows.Close()  checkError(err)  user := new(User)  //users := make([]User,5)  var users []User  for rows.Next() {   // rows.Scan()方法的参数顺序很重要,必须和查询结果的column相对应(数量和顺序都需要一致)   err := rows.Scan(&user.Uid, &user.UserName, &user.CreateTime, &user.Birthday)   checkError(err)   users = append(users, *user)  }  return users } // 查询单条数据 func queryRow(db *sql.DB) User {  stmt, err := db.Prepare("select id,username,createtime,birthday from nsbd_user where id = ?")  checkError(err)  user := new(User)  err = stmt.QueryRow(4).Scan(&user.Uid, &user.UserName, &user.CreateTime, &user.Birthday)  checkError(err)  return *user } //检测错误 func checkError(err error) {  if err != nil {   panic("操作失败:" + err.Error())  } }
  输出: 多条返回:  [{Uid:1 UserName:admin CreateTime:0 Birthday:{String:2017-04-15 Valid:true}} {Uid:2 UserName:u2 CreateTime:1605858072 Birthday:{String:1993-02-14 Valid:true}} {Uid:3 UserName:u3 CreateTime:1606289644 Birthday:{String:1991-05-31 Valid:true}} {Uid:4 UserName:u4 CreateTime:1610521164 Birthday:{String:1989-11-24 Valid:true}} {Uid:5 UserName:u5 CreateTime:1610588359 Birthday:{String: Valid:false}}] 单条返回:  {Uid:4 UserName:u4 CreateTime:1610521164 Birthday:{String:1989-11-24 Valid:true}} 6.3 注意事项rows.Scan() 方法的参数顺序很重要,必须和查询结果的column 相对应(数量和顺序都需要一致);Go 是强类型语言,在查询数据时先定义数据类型,针对字段值为NULL 时,数据类型应定义为:sql.NullString、sql.NullInt64 等,并可以通过Valid 值来判断查询到的值是赋值状态还是未赋值状态。每次 db.Query() 操作后,都建议调用rows.Close() 。rows.Close() 操作是幂等操作,即便对已关闭的rows 再执行close() 也没关系。6.4 为什么查询后要关闭连接?
  因为 db.Query() 会从数据库连接池中获取一个连接,这个底层连接在结果集(rows )未关闭前会被标记为处于繁忙状态。当遍历读到最后一条记录时,会发生一个内部EOF 错误,自动调用rows.Close() 。但如果出现异常,提前退出循环,rows 不会关闭,连接不会回到连接池中,连接也不会关闭,则此连接会一直被占用。因此通常使用defer rows.Close() 来确保数据库连接可以正确放回到连接池中。
  微信搜索【猿码记】获取最新文章信息。

零跑一直在跑向来人们只问前三,不问第四,在车市中,亦是如此。每个月电动车销量发榜,人们总去比较前三的销量如何,三家之间究竟差多少。但销量成绩不是那么好一些车企,鲜少被人提及,比如零跑汽车。一次博弈论的存在时至今日,博弈论已经发展成一门相对成熟和完善的学科。目前,博弈论在多个学科和领域获得了广泛的应用,特别是在生物学经济学计算机科学数学政治军事等学科和领域的表现尤为出色。例如,一些生华为Nova10和荣耀70发布时间基本敲定,选择却纠结了事关华为手机,最近的市场中确实带来了很多好消息,比如国内厂商力通和富满微的5G射频芯片分别可用在5G基站手机等设备上。而且在高性能上芯片上,华为已经计划采用多核架构,用堆叠面积换性手机厂商为降成本阉割4大功能,未来我们还能剩下什么?引言现代社会中,各个国家的科技发展水平都在飞速提升,而手机作为现代人生活中的必需品,手机的更新换代速度更是与日俱增。与传统的功能型手机相比,现代社会中的智能手机能够给予人们更加便捷老米粉的遗憾,MIUI永远有功能没发现,分这5个功能你都发现了吗老米粉的遗憾,MIUI永远有功能没发现,分这5个功能你都发现了吗小米手机的老用户好多都有这样的体验,就是手机用到换机,系统用到换代,后面一看发现还有好多功能没有用到,不是用不到,是国家真的推动,混动车的节奏吗?答案是肯定的!国家因该在大力推行新能源。纯电车是唯一方向吗?混动是另外一种唯一方向吗?氢能源是唯一方向吗?水能源是唯一方向吗?到底什么方向是唯一方向。还是多种方向选一种呢!为什么大NVIDIA开源其Linux内核图形驱动程序NVidia终于在开源驱动程序方面迈出重要一步昨天,NVIDIA发布了一个新的JetsonL4T版本,提供了基于Ubuntu20。04LTS并使用Linux5。10内核的最新样本根php比java的开发效率高在哪?今年刚开始接触Java,正在使用Java做微服务方向的项目,集成了mybatisplus的ORM,首先别的不说,就这个orm让我难受了好长时间,这是个什么玩意,用起来费事的一批,piPhone14新一批渲染图曝光!拒绝刘海屏,全新感叹号设计自从2018年6月份vivo推出升降屏以后,手机行业发生了翻天覆地的变化,传统的屏幕设计直接成为落后。升降屏的设计背后却隐藏着全面屏设计,从当时市场的热度就可以观察到,升降屏推出不背靠腾讯柠萌影视再度冲刺上市过去两年营收利润持续双降本报记者谢若琳4月8日,柠萌影视传媒有限公司(以下简称柠萌影视)再次向港交所递交招股书。2021年1月份,公司曾与中金公司签署上市辅导协议,计划登陆A股,一直没有进展,同年9月份首iPhone14Pro配置规格出炉,iPhone13沦为百元机唱响让路悲歌今日,数码博主ITTechnix曝光了一张iPhone14Pro设置图,曝光图显示,iPhone14Pro采用圆形感叹号打孔屏药丸,取消SIM卡槽,配备更好的摄像头,配备3nmA1
焊接机器人发展阶段和现阶段关注热点焊接智能化高端制造业智能化自动化发展需求,工业机器人得到了快速发展和广泛应用。工业机器人装备前三的依然是日本美国和德国。日本被称为机器人王国,工业机器人数量超过百万。在亚洲,日本韩国和新加坡光子是否有质量?不同的光在同一介子中传播的角度和速度不一样。因为是频率不一样,但为什么不一样呢?我想光有质量,有关系。验证这个猜想,需要计算一个频率与质量的公式。频率是f等于1y,质量是m等于密度大厂裁员只是开始,未来5年,职场人一定做好这些准备最近互联网大裁员的消息非常火爆,各个大厂都放出来裁员通知。比如爱奇艺裁员20到40快手裁员30,快手游戏甚至一度只留6个人字节跳动撤销人才发展中心蘑菇街整体裁员30,其中技术部裁员网络货运是新一轮物流科技革命的开端2022年网络货运对于物流业来说正步入高潮,交通厅的政策优势对网络货运的发展做高度支持,同时企业通过网络货运平台建立企业的运力资源池并且和行业公共运力资源池打通,形成运力的线上化数展示用户IP属地事关监管,无关隐私徐林生4月15日下午,今日头条抖音快手等相继发布公告,称将在个人主页等位置展示账号IP属地,即展示用户最近一个月内最后一次发文或评论时的网络位置。境内展示到省(直辖市自治区特别行政放过那个老实人,真假高刷电视开掰高深莫测的科技行业,加上铺天盖地的营销阵仗,一些浑水摸鱼的伪技术往往能忽悠到一茬出手阔绰的真韭菜(bushi)。比如不少人对某款手机1亿像素的卖点印象深刻,然而懂行的人一看就知道不数字藏品具体是什么?有价值吗?值得收藏吗?什么是数字藏品?根据行业定义,是指利用区块链技术生成与特定作品和艺术品相对应的唯一数字证书。在保护其数字版权的基础上,实现真实可信的数字发行购买收藏和使用。简单说就是数字藏品在区块以数字化推动制造业重构竞争优势制造业是经济发展和社会运转所需生产资料和生活资料的主要生产部门,具有科技创新密集产业关联性高抗冲击能力强等特点。当前,新一轮科技革命和产业变革深入发展,数字技术加速创新,不断成熟扩中国银行董事长刘连舸数字经济要求构建更加安全的金融体系南方财经4月16日电,中国银行董事长刘连舸在2022清华五道口全球金融论坛上表示,数字经济要求构建更加安全的金融体系一是存在数字技术滥用,好多平台出现了很多乱象二是数字安全问题包括竟然有一半的人不知道for与foreach的区别?之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因接下来我们来探讨一下是否能够如此(1)遍历元素首先,我纯电动家轿,为什么很多人都喜欢轩逸纯电?全方面评测!随着用车需求不断变化,越来越多消费者在买车时都会选择纯电动车,毕竟后期能省下很多用车费用,尤其是对于城市通勤以及家用来说很合适,那么对于当下的纯电动家轿车来说,都有哪些车型比较优秀