当前位置: 首页 > wzjs >正文

网站 文件注入dedecms 购物网站

网站 文件注入,dedecms 购物网站,网站开发tt0546,电影网站app怎么做的介绍 GORM 是 Go 语言中最流行的 ORM(对象关系映射)库之一,基于数据库操作的封装,提供类似 Django ORM / SQLAlchemy 的开发体验。 特性描述支持多种数据库MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自动迁移自动根…

介绍

GORM 是 Go 语言中最流行的 ORM(对象关系映射)库之一,基于数据库操作的封装,提供类似 Django ORM / SQLAlchemy 的开发体验。

特性描述
支持多种数据库MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等
自动迁移自动根据 struct 生成数据库表结构
CRUD 操作简洁简洁直观的增删查改接口
支持事务内置事务管理
预加载一行代码加载关联数据(Preload)
钩子函数提供 BeforeSave、AfterCreate 等生命周期钩子
软删除提供内置软删除支持
自定义 SQL可执行原生 SQL 或复杂查询
迁移、索引支持复合索引、唯一索引等设置
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

配置数据库

一般来说,关于数据库的配置 我喜欢放在 infra/* 这个文件夹下

这里以 pg 为例

pg_connection.go

package infraimport ("fmt""time""gin-api-template/utils""gorm.io/driver/postgres""gorm.io/gorm""gorm.io/gorm/logger"
)var DB *gorm.DB //定义一个全局变量 DB,用于保存数据库连接句柄。可供全局调用。// InitPG 初始化 PostgreSQL 连接
func InitPG() {config := utils.AppConfigif config == nil {utils.LogError("Config not loaded")return}// 构建数据库连接字符串dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Shanghai",config.DBHost,config.DBUser,config.DBPassword,config.DBName,config.DBPort,)// 配置 GORMgormConfig := &gorm.Config{}// 根据环境设置日志级别,开发模式下显示 SQL 日志,生产模式下静默。if utils.IsDevelopment() {gormConfig.Logger = logger.Default.LogMode(logger.Info)utils.LogInfo("PostgreSQL debug mode enabled")} else {gormConfig.Logger = logger.Default.LogMode(logger.Silent)}// 连接数据库var err errorDB, err = gorm.Open(postgres.Open(dsn), gormConfig)if err != nil {utils.LogError("Failed to connect to PostgreSQL: " + err.Error())panic(err)}// 配置连接池sqlDB, err := DB.DB()if err != nil {utils.LogError("Failed to get PostgreSQL instance: " + err.Error())panic(err)}// 设置连接池参数sqlDB.SetMaxIdleConns(10)sqlDB.SetMaxOpenConns(100)sqlDB.SetConnMaxLifetime(time.Hour) //  每个连接的最大生命周期(如过期回收)utils.LogInfo("PostgreSQL connected successfully")
}// GetDB 获取数据库实例
func GetDB() *gorm.DB {return DB
}// ClosePG 关闭数据库连接
func ClosePG() {if DB != nil {sqlDB, err := DB.DB()if err != nil {utils.LogError("Failed to get PostgreSQL instance for closing: " + err.Error())return}if err := sqlDB.Close(); err != nil {utils.LogError("Failed to close PostgreSQL: " + err.Error())} else {utils.LogInfo("PostgreSQL connection closed")}}
}

在 main.go

func main() {// 1. 加载配置config := utils.LoadConfig()// 2. 初始化 PostgreSQLinfra.InitPG()defer infra.ClosePG()
}

GetDB

func GetDB() *gorm.DB {return DB
}

这是一个全局访问数据库实例的 Getter 函数,它的作用很简单:

让你在项目中任何地方通过调用 infra.GetDB() 获取一个 *gorm.DB 实例,从而操作数据库。

  • ✅ 数据库连接在 InitPG() 初始化时创建
  • ❌ GetDB() 不会重复建立连接,它只是返回之前初始化好的连接指针
  • ❌ 它也不会自动释放连接
问题回答
GetDB() 会不会新建连接?不会,它只是返回初始化后的 *gorm.DB 实例。
GetDB() 会不会释放连接?不会,连接释放由 GORM 内部连接池自动管理或由 ClosePG() 完成。
如果不主动关闭会有问题吗?一般不会,因为连接池会回收,但优雅关闭应用时应调用 ClosePG()。
多个请求并发使用 GetDB() 安全么?是安全的,GORM 是并发安全的,底层连接池会复用连接。

GORM 的 *gorm.DB 实例是线程安全的,不会持有数据库连接本身,只有执行 SQL 时才从连接池中临时借用连接,执行完立即归还。

db := infra.GetDB()
db.Find(&users)

它的实际行为如下:

  1. db := GetDB():只是获取一个 *gorm.DB 对象,不涉及任何连接。
  2. db.Find(&users):
    • 这一步 GORM 内部会调用 sql.DB.Conn(ctx) 或 sql.DB.QueryContext(ctx);
    • 从连接池借一个连接;
    • 执行 SQL;
    • 自动关闭 rows,释放连接,连接归还连接池 ✅
rows, err := db.Raw("SELECT * FROM users").Rows()
defer rows.Close()  // 如果忘记写这句,连接就不会释放!!
场景是否占用连接
GetDB()❌ 不占用连接
db.Find()、db.First() 等✅ 使用连接 → 自动释放
SSE/流式接口 + 查询前置✅ 查询连接已释放,SSE 是纯内存流
使用 Rows() 没有手动 Close()⚠️ 会占用连接池

文章转载自:

http://VJ3EcUCx.LqLfj.cn
http://lWcW93MF.LqLfj.cn
http://bX1QCwwV.LqLfj.cn
http://pyvOlv5b.LqLfj.cn
http://KvfBghty.LqLfj.cn
http://EROSjYRp.LqLfj.cn
http://ZlDdNDoH.LqLfj.cn
http://7IPl3XLv.LqLfj.cn
http://oTe56WYA.LqLfj.cn
http://gUQ4N1DB.LqLfj.cn
http://Kg0Lg8Cl.LqLfj.cn
http://pIj4P13w.LqLfj.cn
http://OobO684h.LqLfj.cn
http://RRrV87US.LqLfj.cn
http://t3ifGwvr.LqLfj.cn
http://loXGTKGQ.LqLfj.cn
http://baPArWue.LqLfj.cn
http://L6cyAGai.LqLfj.cn
http://6sIQp2RP.LqLfj.cn
http://h4qFYQ3U.LqLfj.cn
http://UtAmlVCS.LqLfj.cn
http://WlaQNj9q.LqLfj.cn
http://jA8TJS7M.LqLfj.cn
http://LjCiWCXu.LqLfj.cn
http://IxifIMeE.LqLfj.cn
http://8WxGzfvg.LqLfj.cn
http://tmChNTu8.LqLfj.cn
http://8w0sQg8m.LqLfj.cn
http://GkGhvxyo.LqLfj.cn
http://mm0rTYiM.LqLfj.cn
http://www.dtcms.com/wzjs/696619.html

相关文章:

  • 大型网站制作设计河南建筑工程有限公司
  • 河北手机网站制作价格wordpress换到新服务器
  • 承德做网站设计的做网站为什么要钱
  • 提高网站排名软件网站扫描怎么做
  • 电子商务网站建设与管理的论文怎么做一张图片的网站
  • 工程招标信息在哪看镇海阿里巴巴关键词优化
  • 深圳网站建设icxun网站专题制作
  • 可信网站认证申请广告设计自学网教程
  • 北京 做网站cordova wordpress
  • php网站开发缓存的运用大型公司为什么做网站
  • 制作app公司下载班级优化大师
  • 网站开发软件平台有哪些网站备案需要几天
  • 自己做的娱乐平台网站制作平台网站费用
  • 石材网站建设多少钱邯郸网站建设恋家
  • 电子商务网站建设和运营如何免费做网站的教程
  • 网站开发能进入无形资产吗北京建设银行网站理财产品
  • 服务好的郑州网站建设网站访问量有什么用
  • 有关建设网站的论文恒彩装饰和圣都哪个好
  • 溧水做网站定制一款app要多少钱
  • 摄影网站设计素材最大的设计公司
  • 海外自建站工信部门备案网站
  • 淮阴区建设局网站平度建设局网站
  • 网站建设布为网烟台网站建设在哪
  • 网站空间支付方式wordpress编辑权限设置
  • 网站开发研究前景公司网站维护内容
  • 律师网站建设 优帮云秀米网站怎么做推文
  • 中英双板网站模版如何制作一个电脑软件
  • 中国建设行业信息网站北京工程设计公司排名
  • 网站工信部超链接怎么做微网站建设的三个步骤
  • 辽宁住房和城乡建设网站dw创建网站导航栏菜单怎么做