首页 > 数据库 >Golang数据库标准库

Golang数据库标准库

时间:2023-08-28 18:31:31浏览次数:48  
标签:city err 数据库 mysql db Golang 标准 sql

驱动

连接数据库是典型的CS架构,服务器端被动等待客户端建立TCP连接,并在此连接上进行特定的应用层协议。但一般用户并不需要了解这些细节,这些都被打包到驱动库中,只需要简单的调用打开就可以执行协议连接到指定的数据库。

数据库的种类和产品很多,协议也很多,Go官方很难提供针对不同数据库的驱动程序,往往由各个数据库官方或第三方给出不同的开发语言驱动库。但是,为了Go语言可以提前定义操作一个数据库的所有行为(接口)和数据(结构体)的规范,这些定义在database/sql下。

MySQL驱动:

安装MySQL的驱动

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

源码中驱动注册:

func init() {
	sql.Register("mysql", &MySQLDriver{})
}

连接

package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/go-sql-driver/mysql" //安装驱动和导入
)

var db *sql.DB
//db类型是*sql.DB,是一个操作数据库的句柄,底层是一个多协程安全的连接池

func init() {
	var err error
	db, err = sql.Open("mysql", "my_root:123@tcp(192.168.131.12:3306)/test")
	//不能使用短格式定义,需要外init函数外部使用
	if err != nil {
		log.Fatal(err)
	}
	db.SetConnMaxLifetime(time.Second * 30) //超时时间
	db.SetConnMaxIdleTime(time.Minute * 5)  //最大空闲时间
	db.SetMaxOpenConns(0)                   //最大链接数,0表示不限制
}

func main() {
	err := db.Ping()
	fmt.Println(err)
}

操作

package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

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

var db *sql.DB

func init() {
	var err error
	db, err = sql.Open("mysql", "my_root:123@tcp(192.168.131.12:3306)/world")
	if err != nil {
		log.Fatal(err)
	}
	db.SetConnMaxLifetime(time.Second * 30)
	db.SetMaxOpenConns(0)
	db.SetMaxIdleConns(10)
}

//MySQL表结构
/*
mysql> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
*/

type City struct { //和字段对应的变量或结构以定义,最好和数据库中的字段顺序对应
	Id          int8
	Name        string
	CountryCode string
	District    string
	Population  int
	Cdate       string
}

func main() {
	//单行查询
	// var city City
	// city := City{}
	city := new(City)
	fmt.Println(city)
	row := db.QueryRow("select * from city where id =?", 10)
	if row.Err() != nil { //如果有错误,则调用error接口返回Error()string错误
		log.Fatal(row.Err().Error())
	}
	err := row.Scan(&city.Id, &city.Name, &city.CountryCode, &city.District, &city.Population, &city.Cdate)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(city)

	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	// 批量查询,预编译
	stmt, err := db.Prepare("select * from city where id <?")
	if err != nil {
		log.Fatal(err)
	}
	defer stmt.Close()
	rows, err := stmt.Query(20)
	if err != nil {
		log.Fatal(err)
	}
	for rows.Next() { //遍历,每一次遍历rows,内部指向当前行
		err := rows.Scan(&city.Id, &city.Name, &city.CountryCode, &city.District, &city.Population, &city.Cdate)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(city)
		fmt.Printf("%T %v ", city.Cdate, city.Cdate)

		t, err := time.Parse("2006-01-02 15:04:05", city.Cdate)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%T %v\n", t, t)
	}

}

标签:city,err,数据库,mysql,db,Golang,标准,sql
From: https://blog.51cto.com/u_14218719/7266056

相关文章

  • 远程桌面连接报错(CredSSP加密数据库修正)解决方案
    远程桌面连接报错(CredSSP加密数据库修正)解决方案: 方法一:修改注册表 按win+r键-输入regedit -点击确定-打开注册表编辑器如下图所示: 在注册表中进入如下路径:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Paramet......
  • Postgresql-数据库无法停止,报错:pg_ctl server does not shut down
    根据您的查询,pg_ctlserverdoesnotshutdown(pg_ctl服务无法关闭)的原因可能有很多。以下是一些可能的解决方案和代码示例:(1)杀死所有与PostgreSQL相关的进程:使用以下命令尝试停止所有与PostgreSQL相关的进程:pg_ctl-D/path/to/postgresql/data_directorystop-mimmediate这......
  • PostgreSQL 查找当前数据库的所有表、字段
     查所有表SELECT tablenameFROM pg_tablesWHERE tablenameNOTLIKE'pg%' ANDtablenameNOTLIKE'sql_%'ORDERBY tablename;查看当前表的所有字段SELECT C.relname, A.attnameASNAME, A.attnotnullASNOTNULL, format_type(A.atttyp......
  • Oracle数据库表空间和角色/用户 权限
    问题1.https://blog.csdn.net/weixin_42446705/article/details/1163377112.https://blog.csdn.net/wanghai__/article/details/47918793.https://www.iteye.com/blog/czmmiao-1304934这个特别好4.https://www.cnblogs.com/abeam/p/13439120.html5.https://blog.csdn.net/l......
  • oracle数据库中插入特殊符号'&'
    在plsql里边执行:updateuserinfosetpageurl='myjsp?page=1&pagesize=10'whereid='test'这条sql语句往数据库的pageurl字段放进去了一个url地址,但是执行的时候却并非那么理想,因为这其中有一个oracle的特殊字符,需要进行转义,那就是字符'&'.怎么处理上例中的特殊字符?两个办法:  ......
  • 理解ORACLE数据库字符集
    一.引言   ORACLE数据库字符集,即Oracle全球化支持(GlobalizationSupport),或即国家语言支持(NLS)其作用是用本国语言和格式来存储、处理和检索数据。利用全球化支持,ORACLE为用户提供自己熟悉的数据库母语环境,诸如日期格式、数字格式和存储序列等。Oracle可以支持多种语言及字符集,......
  • 8月份做Leetcode数据库题心得感受
    做Leetcode的数据库题目,可以提升自己的SQL编程能力,增加对数据库的理解和应用。在做Leetcode数据库题目的过程中,我有以下一些心得感受。首先,了解题目要求和限制条件非常重要。在开始解题之前,要仔细阅读题目描述,理解题目要求和给定的数据表结构。同时,要留意题目中可能存在的限制条件......
  • 数据库 事务 (总)
    一、事务四大特征(ACID)  1、原子性(Atomicity):   事务开始后所有操作,要么全部做完,要么全部不做(回滚),不可以部分执行。2、一致性(Consistency):数据一致性,数据库的完整性约束没有被破坏。3、隔离性(Isolation):    同一时间,只允许一个事务请求同一数据,不同的事务......
  • 数据库索引
    一、基础1、概念类似目录实质:平衡二叉树从广义上讲,SQLServer检索所需数据的方法只有两种:使用全表扫描使用索引B-Tree索引  (MySQL,SQLServer,Oracle)索引每块固定大小4K  选字段一定要考虑字段大小(int4b、long8b) 大多数B-tree就3-4层的深度  比如一层(......
  • 向量数据库(第 3 部分):并非所有索引都是一样的
    这是我关于向量数据库的系列文章的第三篇。第一部分比较了各种数据库供应商的产品以及它们在高层面上的区别,而第二部分则着重介绍了向量数据库的基础知识和功能。您可能已经阅读过DmitryKan在2021年撰写的优秀文章《并非所有向量数据库都是相同的》1,该文章涵盖了市场上各种向量数......