首页 > 数据库 >Go语言(Golang)数据库编程

Go语言(Golang)数据库编程

时间:2023-05-11 10:34:37浏览次数:44  
标签:nil err fmt 编程 db Golang go sql Go

Go 数据库编程

一、连接数据库

准备连接到数据库

  • 要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。
  • sql.Open()
    • 数据库驱动的名称
    • 数据源名称
    • 得到一个指向 sql.DB 这个 struct 的指针
  • sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会自动的创建和释放这些连接
    • 它对于多个 goroutine 并发的使用是安全的
package main

import (
  "context"
  "database/sql"
  "fmt"
  "log"
  
  _ "github.com/denisenkom/go-mssqldb"
)

var db *sql.DB

const (
  server = "xxxx.database.windows.net"
  port = 1433
  user = "xxxxx"
  password = "xxxxx"
  database = "go-db"
)

func main() {
  connStr := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;",
                        server, user, password, port, database)
  
  db, err := sql.Open("sqlserver", connStr)
  if err != nil {
    log.Fataln(err.Error())
  }
  
  ctx := context.Background()
  
  err = db.PingContext(ctx)
  if err != nil {
    log.Fataln(err.Error())
  }
  
  fmt.Println("Connected!")
}

Note

  • Open() 函数并不会连接数据库,甚至不会验证其参数。它只是把后续连接到数据库所必需的 structs 给设置好了
  • 而真正的连接是在被需要的时候才进行懒设置的
  • sql.DB 不需要进行关闭(当然你想关闭也是可以的)
  • 它就是用来处理数据库的,而不是实际的连接
  • 这个抽象包含了数据库连接的池,而且会对此进行维护
  • 在使用 sql.DB 的时候,可以定义它的全局变量进行使用,也可以将它传递到函数/方法里。

如何获得驱动

  • 正常的做法是使用 sql.Register() 函数、数据库驱动的名称和一个实现了 driver.Driver 接口的 struct,来注册数据库的驱动。例如:
    • sql.Register("sqlserver", &drv{})
  • 但是我们之前的例子却没写这句话,为什么?
    • 因为 Sql Server 的驱动,是在这个包被引入的时候进行了自我注册

驱动自动注册

  • 当 go-mssqldb 包被引入的时候,它的 init 函数将会运行并进行自我注册(在 Go 语言里,每个包的 init 函数都会在自动的调用)
  • 在引入 go-mssqldb 包的时候,把该包的名设置为下划线 _,这是因为我们不直接使用数据库驱动(只需要它的”副作用“),我们只使用 database/sql
    • 这样,如果未来升级驱动,也无需改变代码
  • Go 语言没有提供官方的数据库驱动,所有的数据库驱动都是第三方驱动,但是它们都遵循 sql.driver 包里面定义的接口

安装数据库驱动

  • 这是安装 Microsoft SQL Server 数据库驱动的例子:
  • go get github.com/denisenkom/go-mssqldb

func(*DB) PingContext

  • 上例中的 db.PingContext() 函数是用来验证与数据库的连接是否仍然有效,如有必要则建立一个连接。
  • 这个函数需要一个 Context (上下文)类型的参数,这种类型可以携带截止时间、取消信号和其它请求范围的值,并且可以横跨 API 边界和进程。
  • 上例中,创建 context 使用的是 context.Background() 函数。该函数返回一个非 nil 的空 Context。它不会被取消,它没有值,没有截止时间。
  • 它通常用在 main 函数、初始化或测试中,作为传入请求的顶级 Context。

Exercises

  • 使用 PostgreSQL 建立数据库,使用 Go 语言进行连接,并 Ping 一下。
  • 使用 SQLite 建立数据库,使用 Go 语言进行连接,并 Ping 一下。

连接MySQL

https://github.com/go-sql-driver/mysql

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

创建目录

➜ mcd go_sql_demo

Code/go/go_sql_demo via 

标签:nil,err,fmt,编程,db,Golang,go,sql,Go
From: https://www.cnblogs.com/QiaoPengjun/p/17390319.html

相关文章

  • 网络编程-通信协议-三要素
    1.概述:即通过无线网络或者有线网络可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络。这样就实现了计算机之间的资源共享和信息的传递。2.网络通信三要素2.1)ip地址网络中计算机的唯一标识;32bit(4字节),一般用“点分十进制”表示,如:192.168.1.158ip地......
  • golang在编译测试时使用ldflags动态设置包中变量的值
    Example: mkdir$GOPATH/src/gotest/touchgo_test.go packagegotestimport"testing"vartimestringvarversionstringfuncTestBuild(t*testing.T){t.Log(time)t.Log(version)} ReadMe.txtgotest-ldflags="-X'gotest......
  • JavaScript 面向对象编程
    面向对象编程ObjectOrientedProgramming面向对象编程用对象把数据和方法聚合起来。面向对象编程的优点能写出模块化的代码能使得代码更灵活能提高代码的可重用性面向对象编程的原则继承(inheritance):子类/派生类从父类/基类/超类中派生,形成继承结构封装(encapsulati......
  • NGO-LSTM做数据回归预测,NGO北方苍鹰算法优化LSTM的超参数,预测精度高于LSTM,多输入单输
    NGO-LSTM做数据回归预测,NGO北方苍鹰算法优化LSTM的超参数,预测精度高于LSTM,多输入单输出,单输入单输出,时间序列预测都可以。NGO是2022年最新提出来的优化算法。ID:93150694057105045......
  • 编程打卡:C++语言程序设计
    //Node.h#ifndefNODE_H#defineNODE_H//类模板的定义template<classT>classNode{private: Node<T>*next; //指向后继结点的指针public: Tdata; //数据域 Node(constT&data,Node<T>*next=0);//构造函数 voidinsertAfter(Node<T>*p); //......
  • Android系统启动-3-zygote篇-1
    基于Android6.0,相关文件主要是:/frameworks/base/cmds/app_process/App_main.cpp/frameworks/base/core/jni/AndroidRuntime.cpp/frameworks/base/core/java/com/android/internal/os/-ZygoteInit.java-Zygote.java-ZygoteConnection.java/frameworks/base/......
  • Golang刷题日志--岛屿问题
    1.给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例代码:import"fmt"funcnumIsIands(grid[][]byte)int{ //记录岛......
  • Go语言及开发工具LiteIDE的安装
    安装平台macGo语言安装下载go的安装包下载页面:https://golang.org/dl/另外参考http://godoc.golangtc.com/doc/install#install下载完go语言的安装包之后进行安装mac上默认的安装路径是/usr/local/go设置环境变量exportGOROOT=$HOME/goexportPATH=$PATH:$GOROOT/binGo语言开发......
  • go提醒操作
    funcConfirm(promptstring)bool{var(inputStrstringerrerror)_,err=fmt.Fprint(os.Stdout,prompt)iferr!=nil{logger.Error("fmt.Fprinterr",err)os.Exit(-1)}_,err=fmt.Scanf("%s",......
  • 2023.5.10编程一小时打卡
    一、问题描述:给出下面的人员基类框架:classPerson{protected:stringname;intage;public:Person();Person(stringp_name,intp_age);voiddisplay(){cout<<name<<“:”<<age<<endl;}};建立一个派生类student,增加以下成员数据:in......