Go GORM实战(二) | 数据库连接的N种方式

连接数据库

使用GORM连接数据库还是比较简单的,概括起来就是以下三个步骤:

  1. 引入gorm.io/gorm和对应数据库的驱动库,如gorm.io/driver/sqlite

  2. 调用对应驱动库的Open()或New()函数返回一个实现了gorm.Dialector接口的实例。

  3. 调用gorm.Open()方法传入一个gorm.Dialector接口的实例以初始一个gorm.DB对象。

通过上述三个步骤,最终获取一个gorm.DB对象,我们便可以使用该对象的方法操作数据库,如Create,Delete等方法。

MySQL

简单连接

下面是连接mysql数据库最简单的方式,我们只需要定义好dsn便可以了 

package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc main() {//user、password、IP、port、dbnamedsn := "user:password@tcp(ip:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{SkipDefaultTransaction:                   false, //设置为 false 表示不跳过默认事务NamingStrategy:                           nil,   //设置为 nil,表示使用 GORM 的默认命名策略FullSaveAssociations:                     false, //设置为 false 表示不完整保存关联的记录Logger:                                   nil,   //设置为 nil,表示不设置自定义的日志记录器NowFunc:                                  nil,   //设置为 nil,表示使用 GORM 的默认时间函数DryRun:                                   false, //设置为 false,表示不执行模拟运行PrepareStmt:                              false, //设置为 false,表示不预先准备语句DisableAutomaticPing:                     false, //设置为 false,表示不禁用自动心跳检测DisableForeignKeyConstraintWhenMigrating: false, //设置为 false,表示在迁移时不禁用外键约束IgnoreRelationshipsWhenMigrating:         false, //设置为 false,表示在迁移时不忽略关系DisableNestedTransaction:                 false, //设置为 false,表示不禁用嵌套事务AllowGlobalUpdate:                        false, //设置为 false,表示不允许全局更新QueryFields:                              false, //设置为 false,表示不使用字段查询CreateBatchSize:                          0,     //设置为 0,表示使用 GORM 的默认批量创建大小TranslateError:                           false, //设置为 false,表示不转换错误ClauseBuilders:                           nil,   //设置为 nil,表示不设置自定义的查询子句构建器ConnPool:                                 nil,   //设置为 nil,表示使用 GORM 的默认连接池Dialector:                                nil,   //设置为 nil,表示使用 GORM 的默认方言(dialect)Plugins:                                  nil,   //设置为 nil,表示不使用任何插件})if err != nil {panic("数据库连接错误")}DB = db
}
mysql.New

如果我们在连接数据库时,想进一步配置,则可以使用mysql.New()函数,该函数可以传递一个mysql.Config进行详细配置,如:

package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc main() {//user、password、IP、port、dbnamedsn := "user:password@tcp(ip:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"//db, err := gorm.Open(mysql.New(mysql.Config{//	DSN:                       dsn,   // DSN data source name//	DefaultStringSize:         256,   // string 类型字段的默认长度//	DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持//	DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引//	DontSupportRenameColumn:   true,  // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列//	SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置//}))db, err := gorm.Open(mysql.New(mysql.Config{DriverName:                    dsn,   //驱动程序的名称,通常不需要手动设置,GORM 默认使用 mysqlServerVersion:                 "",    //服务器版本,通常在连接成功后由 GORM 自动设置DSN:                           "",    //数据源名称,这是一个包含数据库连接信息的字符串,格式通常为 username:password@tcp(address:port)/dbname?param=valueDSNConfig:                     nil,   //一个 mysql.DSNConfig 类型的配置,用于进一步配置 DSN 字符串Conn:                          nil,   //一个原始的连接对象,通常不需要手动设置SkipInitializeWithVersion:     false, //设置为 false 表示不跳过使用服务器版本进行初始化DefaultStringSize:             0,     //默认的字符串大小,设置为 0 表示使用 GORM 的默认值DefaultDatetimePrecision:      nil,   //默认的 datetime 精度,这里设置为 nil,表示使用 GORM 的默认值DisableWithReturning:          false, //设置为 false 表示不禁用 WITH RETURNING 支持DisableDatetimePrecision:      false, //设置为 false 表示不禁用 datetime 精度支持DontSupportRenameIndex:        false, //以 DontSupport 开头的字段:这些字段表示是否不支持某些特定的数据库功能,这里全部设置为 false,表示没有禁用任何功能DontSupportRenameColumn:       false, //DontSupportForShareClause:     false, //DontSupportNullAsDefaultValue: false, //DontSupportRenameColumnUnique: false, //DontSupportDropConstraint:     false, //}))if err != nil {panic("数据库连接错误")}DB = db
}
通过sql.DB初始化*gorm.DB

如果我们自己使用database/sql打开一个数据库连接,那么也可以利用这个已经存在的连接,来初始化一个gorm.DB对象, 如:

package mainimport ("database/sql""gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc main() {db, err := sql.Open("mysql", "root:123qwe@tcp(localhost:3306)/mysql_db?charset=utf8&parseTime=True&loc=Local")if err != nil {panic(err)}DB, err = gorm.Open(mysql.New(mysql.Config{Conn: db,}))//都可以增删改查//db.Query("")//DB.Find("")
}

 PostgreSQL

简单连接
package mainimport ("gorm.io/driver/postgres" //驱动库"gorm.io/gorm"
)func main() {dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"db, err := gorm.Open(postgres.Open(dsn))if err != nil {panic(err)}db.Exec("")
}
 postgres.New
package mainimport ("gorm.io/driver/postgres""gorm.io/gorm"
)func main() {dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"db, err := gorm.Open(postgres.New(postgres.Config{DSN:                  dsn,PreferSimpleProtocol: true,}))if err != nil {panic(err)}db.Exec("")
}
 通过sql.DB初始化*gorm.DB
package mainimport ("database/sql""gorm.io/driver/postgres""gorm.io/gorm"
)var DB *gorm.DBfunc main() {dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"sqlDB, _ := sql.Open("pgx", dsn)db, err := gorm.Open(postgres.New(postgres.Config{Conn:                 sqlDB,PreferSimpleProtocol: true,}))if err != nil {panic(err)}DB = db
}

SQL Server

简单连接
package mainimport ("gorm.io/driver/sqlserver""gorm.io/gorm"
)func main() {dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"db, err := gorm.Open(sqlserver.Open(dsn))if err != nil {panic(err)}
}
 sqlserver.New
package mainimport ("gorm.io/driver/sqlserver""gorm.io/gorm"
)func main() {dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"db, err := gorm.Open(sqlserver.New(sqlserver.Config{DSN: dsn,}))
}
 通过sql.DB初始化*gorm.DB 
package mainimport ("database/sql""gorm.io/driver/sqlserver""gorm.io/gorm"
)func main() {dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm"sqlDB, _ := sql.Open("sqlserver", dsn)db, err := gorm.Open(sqlserver.New(sqlserver.Config{Conn: sqlDB,}))
}

SQLite

因为SQLite数据库其实只是一个文件而已,所以SQLite的连接非常简单,只需要传入SQLite数据库的文件路径即可,比如我们连接一个在当前目录的gorm.db数据

package mainimport ("gorm.io/driver/sqlite" //驱动库"gorm.io/gorm"
)func main() {db, err := gorm.Open(sqlite.Open("gorm.db")) //参数名随便,后缀也可以随便只要合法就可以/*SQLite 数据库文件并不一定要以 .db 为后缀名。SQLite 是一个非常灵活的数据库系统,它不关心文件的扩展名是什么。可以使用任何合法的文件名,包括但不限于 .db、.sqlite、.db3(这是 SQLite 默认的文件扩展名之一)或者其他任何您喜欢的名称*/
}

另外,连接SQLite数据库时,也可以在内存中创建临时数据库,而需要一个实际的数据库,SQLite 允许您使用特殊的语法来创建一个基于内存的数据库,这个数据库不会持久化到磁盘上,而是存储在内存中,基于内存的数据库在程序结束时会自动销毁,所有数据都会丢失。如果您需要在程序之间保留数据,您应该使用存储在磁盘上的数据库文件。

使用 :memory: 伪路径创建基于内存的数据库:
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})

使用 :memory: 会创建一个新的基于内存的数据库,每次程序运行时都会重新创建。这个数据库在程序结束时自动销毁。

使用 file::memory: 伪路径创建基于内存的数据库:
db, err := gorm.Open(sqlite.Open("file::memory:"), &gorm.Config{})

 file::memory::memory: 相似,也是创建基于内存的数据库。但是,file::memory: 允许 SQLite 使用更多的文件接口功能。

使用 file::memory:?cache=shared 创建共享缓存的基于内存数据库:
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})

使用 cache=shared 参数可以创建一个所有数据库连接都共享同一数据库状态缓存的基于内存数据库。这可以提高并发访问数据库的性能。

 gorm.Config

gorm.Config实现了Option接口,因此我们可以将gorm.Config传递给gorm.Open函数,gorm.Config的源码 

// Config GORM config
type Config struct {//跳过默认事务SkipDefaultTransaction bool// 命名策略,可以定义表名,列表等生成规则NamingStrategy schema.Namer// 在创建或更新时,是否更新关联数据FullSaveAssociations bool// 日志接口,用于实现自定义日志Logger logger.Interface// 创建时间使用的函数NowFunc func() time.Time// 生成 SQL 但不执行,可以用于准备或测试生成的 SQLDryRun bool// 是否禁止创建 prepared statement 并将其缓存PrepareStmt bool// 禁止去ping数据库,检测是否可用DisableAutomaticPing bool// 是否禁止自动创建外键约束DisableForeignKeyConstraintWhenMigrating bool// 是否禁止嵌套事务DisableNestedTransaction bool// 是否允许全局update/deleteAllowGlobalUpdate bool// 执行查询时,是否带上所有字段QueryFields bool// 默认批量插入大小CreateBatchSize int
}

 连接池

通过数据库连接池,我们可以避免频繁创建和销数据库连接所带来的开销,GROM的数据连接池底层是通过database/sql来实现的,所以其设置方法与database/sql是一样的 

sqlDB, err := db.DB()// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)

 关闭数据库

程序执行结束后,需要关闭数据连接,而GORM的底层仍然是通过database/sql去连接数据库的,因此要通过gorm.DB对象的DB()方法返回的sql.DB来关闭数据库连接

sqlDB, err := db.DB()sqlDB.Close()//defer sqlDB.Close()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1425156.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

全国老年大学或将进入“5G智慧校园“时代

近日,我国晚年大学协会在北京举行官网改版上线典礼,一起这也标志着我国晚年大学协会及全国晚年大学进入了“5G智慧校园”年代。据了解,5G智慧校园以“云”技能为根底,全面落实数字云、办理云、安全云。 “三朵云”助推5G智慧校园&…

Find My资讯|苹果 iOS 17.5 率先执行跨平台反跟踪器标准

苹果和谷歌公司于 2023 年 5 月宣布推出“检测预期外位置追踪器”(Detecting Unwanted Location Trackers)行业标准,经过 1 年多的打磨之后,该标准目前已通过 iOS 17.5 部署到 iPhone 上。谷歌也将为运行 Android 6.0 或更高版本的…

web安全学习笔记(16)

记一下第27-28课的内容。Token 验证 URL跳转漏洞的类型与三种跳转形式;URL跳转漏洞修复 短信轰炸漏洞绕过挖掘 一、token有关知识 什么是token?token是用来干嘛的?_token是什么意思-CSDN博客 二、URL跳转漏洞 我们在靶场中,…

Originx的创新解法之:应用程序故障篇

Originx并不期望做一个完整覆盖全栈的监控体系,而是利用北极星指标体系标准化找出故障方向,然后联动各种成熟的监控数据形成证据链条,并将各种数据融合在一个故障报告之中。更多信息请参考 Log | Metrics | Trace的联动方式探讨http://mp.wei…

KING大咖直播 | KES RAC如何成为核心系统首选?

核心系统负载高 停机代价大 KES RAC来了 KingbaseES共享存储集群 不仅满足您对数据库 扩展性与可用性的严苛要求 更能在保障性能的同时 实现低成本、高效益 是企业核心系统的理想选择 5月16日19:30-20:30 锁定金仓数据库视频号 人大金仓高级研发工程师 深度揭秘如何实现 Kingba…

Linux ps命令详细参数

一、简介 在Linux系统中,ps(Process Status的缩写)命令常常用来用来列出系统中当前运行的进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程…

失而复得:揭秘删除照片恢复的技巧!

我们的生活与照片紧密相连。每一张照片都承载着一段独特的记忆,记录着我们的喜怒哀乐。然而,有时候我们会因为误操作、存储设备损坏或是文件管理不当而失去这些宝贵的照片。别担心!现在,我们将揭示删除照片恢复的神秘面纱&#xf…

ATA-2021B高压放大器在光纤超声传感器中的应用

实验名称:超声传感性能研究 测试目的: 光纤马赫-曾德尔干涉仪是一种灵敏度高、结构灵活的传感结构。当在MZI上施加超声波信号时,会影响所涉及的干涉光之间的光程差,并导致干涉光谱的漂移。由于模式耦合是基于MZI的光纤传感器的关键…

前端学习第一课

AJAX 事先说明,这只是记录,并不是从零到一的教学内容,如果想要学习的话,可以跳过本文章了 ok,转回正题,正如上面所说,这只是记录。其实我是有一定的前端基础的,也做过涉及相关的开发…

centos7.9安装es7.12.0

下载es 国内镜像:https://mirrors.huaweicloud.com/elasticsearch/7.12.0/ 下载并上传内容到/usr/local目录下 解压: tar -zxvf /uar/local/elasticsearch-7.12.0-linux-x86_64.tar.gz安装 es一般不能用root启动,因此需要创建es:es用户和…

又一个行业被Ai背刺了:Comfyui生成你的专属模特!

工作流获取方式放在文末了 Ai技术的进步,带来了许多之前无法实现的新技术和新成品,这也使得曾经需要漫长的时间和复杂的创作过程才能够完成的工作呗Ai技术轻松代替。 于此同时,不同行业也在这个过程中受到了不同程度的冲击。 今天给大家分…

反激式开关电源-8利用AP法进行变压器设计

变压器AP的计算 在变压器设计中,主要有两种方法,一种称为Kc法,这种方法也称为磁芯几何参数法,如果用这个方法来进行设计,那么我们首先要计算出磁芯的几何参数Kc值,在这个参数上留有一定的裕度后选取和Kc值…

在win10折腾Flowise:部署和尝试

Flowise 是一种低代码/无代码拖放工具,旨在让人们轻松可视化和构建 LLM 应用程序。 本地部署 操作系统: win10 由于网络、操作系统等各种未知问题,使用npm install -g flowise的方式,尝试了很多次,都没有部署成功&am…

信息安全相关内容

信息安全 安全防护体系 安全保护等级 安全防护策略 安全技术基础 安全防护体系 安全防护体系有7个等级 安全保护等级 安全保护等级有5个等级,从上到下是越来越安全的用户自主其实就是用户自己本身具有的相应的能力 安全防护策略 安全策略是对抗攻击的主要策略安全日志: …

24长三角B题1-5问完整代码+15页保姆级思路已更新

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的,大家可以参考我往期的资料,所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意:(建议先下单占坑,因为随着后续我们更新资料数…

单片机烧录程序时“DTR的低电平复位,RTS高电平进入bootloader”有关的串口Modem联络信号

烧录程序时常见DTR和RTS引脚 参考,参考视频 因为常常使用的都是串口下载程序,常用的芯片CH340系列,下图中标红的引脚是MODEM联络信号,其中常见的DTR和RTS就是常见的串口Modem网络输出信号,也就是通过烧录软件控制的接…

一键操作!如何轻松将安卓手机视频传输到电脑

在这篇文章中,我们将探讨如何使用Coolmuster Android Assistant软件,从安卓设备传输视频文件到电脑。Coolmuster Android Assistant是一款强大的管理工具,它能够帮助用户轻松地管理安卓设备上的数据,包括联系人、短信、应用程序、…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.8

目录 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周:优化算法 (Optimization algorithms)2.8 Adam 优化算法(Adam optimization algor…