官方database/sql包介绍

介绍

  • 在Go中访问数据库,需要使用sql.DB类型用于创建语句和事务,执行查询和获取结果
  • 一个sql.DB不是一个数据库连接,它是一个数据库的抽象
  • sql.DB通过驱动程序打开或关闭与实际数据库的连接并根据需要管理一个连接池
  • database/sql包只是提供了接口,没有任何实现,因此还需要导入第三方数据库驱动
  • 通常不应直接使用第三方驱动,而应该仅引用 database/sql 中定义的方法和类型,这有助于避免使你的代码取决于驱动程序

连接数据库

import ("database/sql"                             //只需导入你需要的驱动即可_ "github.com/go-sql-driver/mysql"          //mysql驱动_ "github.com/lib/pq"                        //postgres驱动
)func main() {//避免反复open,将db作为全局变量或参数db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbdemo")db, err := sql.Open("postgres", "postgres://bob:secret@1.2.3.4:5432/mydb?sslmode=verify-full")db, err = sql.Open("postgres", "user=bob password=secret host=1.2.3.4 port=5432 dbname=mydb sslmode=verify-full")if err != nil {log.Fatal(err)}//仅在最后关闭dbdefer db.Close()//测试与数据库的连通err = db.Ping()if err != nil {// do something here}
}

操作数据库

  • 在MySQL中,参数占位符为?;在PostgreSQL中为$N,其中N为从1开始的数字;SQLite接受这两者之一;Oracle占位符中以冒号开始,并命名为:param1

查询

通用查询

var (id   intname string
)
rows, err := db.Query("SELECT id,name FROM users WHERE id = $1", 1)
if err != nil {log.Fatal(err)
}
//rows不被关闭,底层连接就处于忙,在连接池中不可用,将造成内存泄漏
defer rows.Close()
for rows.Next() {//处理过程中的异常err := rows.Scan(&id, &name)if err != nil {log.Fatal(err)}log.Println(id, name)
}
//处理结尾处的异常
err = rows.Err()
if err != nil {log.Fatal(err)
}

单行查询

var name string
//无需关闭row
err = db.QueryRow("SELECT name FROM users WHERE id = $1", 1).Scan(&name)
if err != nil {log.Fatal(err)
}
fmt.Println(name)

预编译查询

  • 所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化
  • 一次编译、多次运行,省去了解析优化等过程;此外预编译语句还能防止 SQL 注入
stmt,err := db.Prepare("SELECT id,name FROM users WHERE id = $1")
if err != nil {log.Fatal(err)
}
defer stmt.Close()
rows, err := stmt.Query(1)
if err != nil {log.Fatal(err)
}
defer rows.Close()
for rows.Next() {// ...
}
if err = rows.Err(); err != nil {log.Fatal(err)
}//预编译单行查询
stmt, err := db.Prepare("SELECT name FROM users WHERE id = $1")
if err != nil {log.Fatal(err)
}
var name string
err = stmt.QueryRow(1).Scan(&name)
if err != nil {log.Fatal(err)
}
fmt.Println(name)

修改

  • 使用Exec()来完成,最好用一个预编译的语句来完成INSERT,UPDATE,DELETE或者其他不返回行的语句
stmt, err := db.Prepare("INSERT INTO users(name) VALUES($1)")
if err != nil {log.Fatal(err)
}
res, err := stmt.Exec("Dolly")
if err != nil {log.Fatal(err)
}
lastId, err := res.LastInsertId()
if err != nil {log.Fatal(err)
}
rowCnt, err := res.RowsAffected()
if err != nil {log.Fatal(err)
}
log.Printf("ID = %d, affected = %d
", lastId, rowCnt)

database/sql相关推荐

  1. golang database/sql包 简介

    概述 sql.DB不是一个连接,它是数据库的抽象接口.它可以根据driver打开关闭数据库连接,管理连接池.正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用.所以,如果你没有把连接释放回连接池 ...

  2. go中的database/sql接口

    Go与PHP不同的地方是Go官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处,只要是按照标准接口开发的代码, 以后需要迁 ...

  3. oracle 在此 select 语句中缺少 into 子句,Go database/sql文档

    No.1 文档概要 在Golang中使用SQL或类似SQL的数据库的惯用方法是通过 database/sql 包操作.它为面向行的数据库提供了轻量级的接口.这篇文章是关于如何使用它,最常见的参考. 为 ...

  4. go操作mysql(原生database/sql, sqlx库)GORM

    GORM官网地址: GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly. 参考: ...

  5. mysql pmt函数怎么用_在Golang中如何正确地使用database/sql包访问数据库

    本文记录了我在实际工作中关于数据库操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上的东西,所以希望能抛砖引玉,也算是对这个问题的一次总结.其实我也是一个新手,机缘巧合几 ...

  6. 组件分享之后端组件——基于Golang实现的database/sql附加功能组件dbr

    组件分享之后端组件--基于Golang实现的database/sql附加功能组件dbr 背景 近期正在探索前端.后端.系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题, ...

  7. 【旧文重新排版】借 Go 语言 database/sql 包谈数据库驱动和连接池设计

    文 | jiayangchen 封面图片 | Unsplash 因为之前的文章感觉排版太差了,不容易阅读 接下来会把一些旧文重新排版再发一下 即使你不了解 Go 语言,阅读本文也不会有障碍 1. 什么 ...

  8. 数据库 DB database SQL DBMS

    数据库 DB   database 用来管理数据库的计算机管理系统称为,数据库管理系统   DBMS    database management system 为啥专用系统来管理数据 1无法多人共享 ...

  9. php查询sql2008数据库操作系统,使用 PHP 进行查询 - Azure SQL Database SQL Managed Instance | Microsoft Docs...

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 快速入门:使用 PHP ...

最新文章

  1. php扩展模块安装-lamp
  2. pg数据库与MySQL的count函数_postgresql数据库连接数和状态查询操作
  3. 火狐和chrome_Firefox,Chrome和Edge都将支持WebAuthn的硬件两因素身份验证
  4. 使用Ajax的Spring MVC REST调用
  5. vs 2008 Ide 设置
  6. 【LeetCode笔记】232. 用栈实现队列(Java、栈、队列)
  7. python分析pcap文件_利用Python库Scapy解析pcap文件的方法
  8. AI Challenger全球AI挑战赛开幕,300万奖金池,还可能获李开复投资
  9. Android 查看內存使用
  10. Redis视频教程免费下载
  11. SpringMVC_开天辟地
  12. oracle表转换mysql建表语句
  13. 《C陷阱与缺陷》读书笔记与总结
  14. 南大计算机课程,南京大学 计算机系统基础 课程实验 2018(PA0-1)
  15. 关于快递查询接口的实现
  16. 小虎队《爱》 —— 米扑科技公司司歌
  17. (附源码)springboot工作计划管理软件 毕业设计 181638
  18. 中信银行总行信息科技岗2019年校园招聘
  19. openid无效什么意思_“洋河年份原浆”商标被驳回,为什么古井贡酒坐不住了?...
  20. 12.5米分辨率DEM

热门文章

  1. 软链接与硬链接的区别
  2. 离散数学-10 群与环
  3. [ArrayList删除元素] 你需要了解的ArrayList如何安全的删除重复元素/ list去重
  4. 三菱4轴控制伺服案例,三菱PLC FX3U加三菱1PG定位模 块控制4个松下伺服,有完整的注释,结构清晰明了。伺服控制程序JOG HOME 定位 全部写成了功能块FB .你可以直接拿过去用
  5. 《逆向工程核心原理》相关说明
  6. Python遗传算法求一元函数最大值
  7. 如何成为java架构师?2023版Java架构师学习路线总结完成,真实系统有效,一切尽在其中
  8. 学习英语的方法(转载)
  9. Mac宝藏软件推荐(笔者也在用)(二)
  10. linux配置gcc环境,linux gcc4.8安装(多个gcc环境)