基本概念

  • Open() – creates a DB
  • Close() - closes the DB
  • Query() - 查询
  • QueryRow() -查询行
  • Exec() -执行操作,update,insert,delete
  • Row - A row is not a hash map, but an abstraction of a cursor
  • Next()
  • Scan()

注意:DB并不是指的一个connection

连接到数据库

我们以mysql为例,使用github.com/go-sql-driver/mysql,首先我们需要导入我们需要的包

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

注意我们导入github.com/go-sql-driver/mysql 前面用了一个"",操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数,import的时候其实是执行了该包里面的init函数,初始化了里面的变量,_操作只是说该包引入了,我只初始化里面的 init函数和一些变量,但是往往这些init函数里面是注册自己包里面的引擎,让外部可以方便的使用,就很多实现database/sql的包,在 init函数里面都是调用了sql.Register(name string, driver driver.Driver)注册自己,然后外部就可以使用了。
我们用Open()函数来打开一个database handle

db, err := sql.Open("mysql", "user:password@tcp(ip:port)/database")

写一个完整的:

import ("database/sql" _ "github.com/go-sql-driver/mysql" "log" ) func main() { db, err := sql.Open("mysql", "user:password@tcp(ip:port)/database") if err != nil { log.Println(err) } //在这里进行一些数据库操作 defer db.Close() }

我们在执行Open函数的时候,并不会去获得数据库连接有效性,当执行数据库操作的时候才会去连接,当我们需要在Open之后就知道连接的有效性的时候,可以通过Ping()来进行

err = db.Ping() if err != nil { log.Println(err) }

我们通常习惯使用Close来关闭数据库连接,但是sql.DB是被设计成长期有效的类型,我们不应该频繁的Open和Close,相反,我们应该建立一个sql.DB,在程序需要进行数据库操作的时候一直使用它,不要在一个方法里面进行Open和Close,应该把sql.DB作为参数传递给方法

进行数据库操作

增删改操作

Exec()方法一般用于增删改操作,这里以增加为例:

stmt, err := db.Prepare("insert into user(name,age)values(?,?)") if err != nil { log.Println(err) } rs, err := stmt.Exec("go-test", 12) if err != nil { log.Println(err) } //我们可以获得插入的id id, err := rs.LastInsertId() //可以获得影响行数 affect, err := rs.RowsAffected()

查询操作

一般的查询

    var name stringvar age int rows, err := db.Query("select name,age from user where id = ? ", 1) if err != nil { fmt.Println(err) } defer rows.Close() for rows.Next() { err := rows.Scan(&name, &age) if err != nil { fmt.Println(err) } } err = rows.Err() if err != nil { fmt.Println(err) } fmt.Println("name:", url, "age:", description)

我们应该养成关闭rows的习惯,在任何时候,都不要忘记rows.Close().哪怕这个rows在确实循环完之后,已经自动关闭掉了,我们定义rows.Close()也是对我们没有坏处的,因为我们无法保证,rows是否会正常的循环完。

查询单条记录,

我们使用db.QueryRow()

    var name stringerr = db.QueryRow("select name from user where id = ?", 222).Scan(&name)

没有结果的时候会返回err

处理空值

我们用一个name字段为空的记录来举例

var name NullString
err := db.QueryRow("SELECT name FROM names WHERE id = ?", id).Scan(&name) ... if name.Valid { // use name.String } else { // value is NULL }

在这种情况下我们通常使用NullString,但是有时候我们并不关心值是不是Null,我们只需要吧他当一个空字符串来对待就行。这时候我们可以使用[]byte(null byte[]可以转化为空string) 或者 sql.RawBytes,

var col1, col2 []byte for rows.Next() { // Scan the value to []byte err = rows.Scan(&col1, &col2) if err != nil { panic(err.Error()) // Just for example purpose. You should use proper error handling instead of panic } // Use the string value fmt.Println(string(col1), string(col2)) }

使用*sql.RawBytes

package main
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { // Open database connection db, err := sql.Open("mysql", "user:password@/dbname") if err != nil { panic(err.Error()) // Just for example purpose. You should use proper error handling instead of panic } defer db.Close() // Execute the query rows, err := db.Query("SELECT * FROM table") if err != nil { panic(err.Error()) // proper error handling instead of panic in your app } // Get column names columns, err := rows.Columns() if err != nil { panic(err.Error()) // proper error handling instead of panic in your app } // Make a slice for the values values := make([]sql.RawBytes, len(columns)) // rows.Scan wants '[]interface{}' as an argument, so we must copy the // references into such a slice // See http://code.google.com/p/go-wiki/wiki/InterfaceSlice for details scanArgs := make([]interface{}, len(values)) for i := range values { scanArgs[i] = &values[i] } // Fetch rows for rows.Next() { // get RawBytes from data err = rows.Scan(scanArgs...) if err != nil { panic(err.Error()) // proper error handling instead of panic in your app } // Now do something with the data. // Here we just print each column as a string. var value string for i, col := range values { // Here we can check if the value is nil (NULL value) if col == nil { value = "NULL" } else { value = string(col) }

转载于:https://www.cnblogs.com/mafeng/p/6207281.html

Golang操作数据库相关推荐

  1. golang mysql封装_自己封装的golang 操作数据库方法

    这个是我用Go写的第一个东东,可能还存在些BUG没有测试到.这里主要是提供一个参考.各位可以改写成自己的风格. 在命令行下输入如下两条命令,进行安装 go get github.com/male110 ...

  2. golang 字符串排序_Golang操作数据库Redis

    在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问 ...

  3. golang操作postgresql数据库jsonb类型

    golang操作postgresql数据库jsonb类型 本文以案例为主,少言,自悟. 推荐一个测试sql的网站 SQL操作 // 创建一个带有jsonb列的表 CREATE TABLE items ...

  4. mysql操作数据库的步骤,Golang操作MySql数据库的完整步骤记录

    前言 MySQL是业界常用的关系型数据库,在平时开发中会经常与MySql数据库打交道,所以在接下来将介绍怎么使用Go语言操作MySql数据库. 下载MySql连接驱动 Go语言中的database/s ...

  5. 封装一个自己的golang操作MySQL数据库工具

    封装一个自己的golang操作MySQL数据库工具 准备工作 导入驱动 连接mysql 增删改查 增 删 改 查 准备工作 首先我们要准备一个写golang的IDE,我用的是goland,还可以用vs ...

  6. Golang操作sqlite3数据库教程

    Golang操作sqlite3数据库教程 本文介绍sqlite数据库,如何使用sqlite3包操作轻量级关系型数据库. sqlite概述 sqlite是嵌入式关系型数据库引擎,官方描述为自包含的.无服 ...

  7. golang 执行sql语句_Go语言学习笔记(Golang操作MySQL数据库)

    GO连接MySQL 通过GO页面作为客户端访问数据库 1.因为GO语言没有提供任何官方数据库驱动,所以需要安装第三方函数库. 2.由于在github上安装,所以需要安装git软件,安装过程一直点击下一 ...

  8. golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制(mongodb4.0)

    关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! 作者: sdghchj 本文链接:golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制_s ...

  9. Django 使用 ORM 操作数据库详解

    ORM 是个啥? 在python中的一个默认的编写规范是一切皆对象,这样做使得代码简洁,结构清晰,便于维护和重用代码,同时极大的提升开发效率. 同样在操作数据库时,一般我们用SQL语句来实现操作,但是 ...

  10. 04:sqlalchemy操作数据库 不错

    目录: 1.1 ORM介绍(作用:不用原生SQL语句对数据库操作) 1.2 安装sqlalchemy并创建表 1.3 使用sqlalchemy对表基本操作 1.4 一对多外键关联 1.5 sqlalc ...

最新文章

  1. pandasDataFrame 的定位指定文件
  2. ADO.NET Entity Framework 使用数据定义语言(实体框架)
  3. JS日期加减,日期运算
  4. 盘式制动系统卡钳分类
  5. 简单扩展shiro 实现NOT、AND、OR权限验证(支持复杂一点的表达式)
  6. js修改style中某个属性_JS 和 CSS 交互的 5 种方法
  7. 白鹭引擎增加点击事件实例
  8. 跨平台开源通讯组件elastic communication
  9. powerdesigner总结
  10. vue 跳转页面带对象_vue跳转页面的几种方法(推荐)
  11. Spring-MVC的配置文件及路径问题
  12. idea DataGrip 使用图解教程
  13. sublime 3 前端神器详细 安装教程
  14. dubbo学习笔记一(服务注册)
  15. MySQL数据库远程连接开启方法
  16. 【开发环境准备】更新板载ESP8285固件
  17. 把 14 亿中国人都拉到一个微信群,在技术上能实现吗?
  18. 大话西游2服务器维护公告,2017年02月23日停机维护公告
  19. Redis HyperLogLog 是什么?这些场景使用它,让我枪出如龙,一笑破苍穹
  20. 如何设计淘宝天猫这种成功而有价值大数据可视化?

热门文章

  1. LINUX下载编译SDL2
  2. LINUX下载编译libfaac
  3. jogamp-env.xml:48: Unsupported Java version: 11. Make sure that the version of the Java compiler is
  4. 无法解析的外部符号:GetWindowThreadProcessId/EnumWindow
  5. 重载下标操作符,检查内存越界
  6. 公司决策层时刻想着:怎样开展业务,怎样防止公司完蛋
  7. 自从我不管事后,员工们肯定舒心多了
  8. 管理感悟:学会推论及验证
  9. Internet校验和
  10. 简述计算机网络安全的内容,网络常用的安全机制有那些,网络安全期末复习题解说.doc...