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

gorm:初识gorm

初识gorm

什么是 Gorm

Gorm 是一个使用 Go 语言开发的 ORM 库,它提供了一种方便的方式来处理数据库操作。它允许开发人员使用面向对象的方式来处理数据库表和记录,而不需要直接编写复杂的 SQL 查询语句。Gorm 的设计目标是简单易用,同时提供了一系列强大的特性,例如高级查询、事务管理等。

在这里插入图片描述

为什么选择 Gorm

  • 简化数据库操作:使用 Gorm,你可以使用简单的代码来执行各种数据库操作,例如创建、读取、更新和删除数据,而无需编写冗长的 SQL 查询语句。
  • 高级查询功能:Gorm 提供了强大的查询功能,包括条件查询、排序、分页等。这使得在处理复杂查询时变得更加轻松和灵活。
  • 跨数据库支持:Gorm 支持多种主流数据库,包括 MySQL、PostgreSQL、SQLite 等,使得你可以轻松切换和适配不同的数据库平台。
  • 集成方便:Gorm 可以与其他流行的 Go 框架(如 Gin、Echo 等)无缝集成,使得开发过程更加高效。

安装 Gorm

在开始使用 Gorm 之前,你需要先安装它。你可以通过在终端中运行以下命令来安装 Gorm:

go get -u gorm.io/gorm

连接数据库

  1. 启动数据库
    在开始数据库操作之前你需要先连接到数据库,这里实用docker启动postgresql,启动配置的docker-compose.yaml配置如下:
version: '3.8'services:postgresql:image: bitnami/postgresql:latestcontainer_name: postgresqlrestart: unless-stoppedenvironment:# 必需:设置 PostgreSQL 的超级用户密码- POSTGRESQL_PASSWORD=andrew# 可选:设置其他配置- POSTGRESQL_USERNAME=andrew- POSTGRESQL_DATABASE=dbdata- POSTGRESQL_POSTGRES_PASSWORD=andrew  # 为 postgres 用户设置密码volumes:# 将主机目录挂载到容器内的持久化路径# 宿主机路径:~/docker/postgresql# 容器内部路径:/bitnami/postgresql- ~/docker/postgresql:/bitnami/postgresqlports:# 映射 PostgreSQL 默认端口(可选)- "5432:5432"# 可选:设置资源限制# deploy:#   resources:#     limits:#       memory: 512M#     reservations:#       memory: 256M# 可选:健康检查healthcheck:test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]interval: 10stimeout: 5sretries: 5

然后使用一下命令就可启动 docker-compose up -d 为了方便后期启停,将以上命令封装成如下脚本 start.sh

#!/bin/bash#
# 查看日志
#docker-compose logs -f postgresql# 启动(后台运行)
docker-compose up -d
  1. 连接数据库
//dsn := "host=192.168.1.102 user=andrew dbname=dbdata password=andrew sslmode=disable TimeZone=Asia/Shanghai"
// postgres 数据库类型
// andrew:andrew 数据库用户名密码和compose的yaml配置中保持一致
// dbdata 数据库名字
dsn := "postgres://andrew:andrew@host:port/dbdata?sslmode=disable"  
// 打开数据库连接  
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})  
if err != nil {  log.Fatalf("failed to connect database: %v", err)  
}  // 测试连接是否成功  
sqlDB, _ := db.DB()  
err = sqlDB.Ping()  
if err != nil {  log.Fatalf("could not establish a valid connection: %v", err)  
}  
log.Println("Connected to the database successfully!")

如果正常,屏幕上会看到如下打印:

2025/08/06 15:58:16 Connected to the database successfully!Process finished with the exit code 0

创建并更新数据库表结构

在完成数据库连接之后,就可以对数据库进行增删改查了,在开始操作数据之前先使用AutoMigrate创建数据表结构

// 根据 Go 的结构体定义,自动创建或更新数据库表结构  
db.AutoMigrate(&Product{})

然后就能对数据进行增删改查了

package main  import (  "gorm.io/driver/postgres"  "gorm.io/gorm"    "log")  type Product struct {  gorm.Model  Code  string  Price uint  
}  func main() {  //dsn := "host=10.168.8.110 user=andrew dbname=dbdata password=andrew sslmode=disable TimeZone=Asia/Shanghai"  dsn := "postgres://andrew:andrew@10.168.8.110:5432/dbdata?sslmode=disable"  // 打开数据库连接  db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})  if err != nil {  log.Fatalf("failed to connect database: %v", err)  }  // 测试连接是否成功  sqlDB, _ := db.DB()  err = sqlDB.Ping()  if err != nil {  log.Fatalf("could not establish a valid connection: %v", err)  }  log.Println("Connected to the database successfully!")  // Migrate the schema  // 根据 Go 的结构体定义,自动创建或更新数据库表结构  db.AutoMigrate(&Product{})  // Create  db.Create(&Product{Code: "D42", Price: 100})  // Read  var product Product  db.First(&product, 1)                 // find product with integer primary key  db.First(&product, "code = ?", "D42") // find product with code D42  // Update - update product's price to 200    db.Model(&product).Update("Price", 200)  // Update - update multiple fields  db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields  db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})  // Delete - delete product  db.Delete(&product, 1)  }
gorm.Model

GORM 提供了一个名为 gorm.Model 的预定义结构体,其中包含常用字段:

type Model struct {  // 每条记录的唯一标识符(主键)ID        uint `gorm:"primarykey"`  // 自动设置为创建记录的当前时间CreatedAt time.Time  // 每当记录更新时自动更新到当前时间UpdatedAt time.Time  // 用于软删除(将记录标记为已删除但实际上并未将其从数据库中删除)。DeletedAt DeletedAt `gorm:"index"`  
}

嵌入到你的结构体中 :你可以将 gorm.Model 直接嵌入到你的结构体中,以自动包含这些字段。这对于维护不同模型之间的一致性以及利用 GORM 的内置约定非常有用,请参阅嵌入式结构体

http://www.lryc.cn/news/612167.html

相关文章:

  • 线性代数中矩阵的基本运算运算
  • 二、Istio流量治理(一)
  • Kali Linux虚拟机安装和中文配置详细教程(2025版)
  • Aop中的相关术语
  • FluentUI的介绍与使用案列
  • K8S的POD数量限制
  • 《Transformer黑魔法Mask与Softmax、Attention的关系:一个-∞符号如何让AI学会“选择性失明“》
  • sqli-labs靶场less40-less45
  • 【python中级】关于Flask服务在同一系统里如何只被运行一次
  • 大型音频语言模型论文总结
  • 基于CentOS-7.6部署k8s-1.24.0,containerd作为CRI,nerdctl作为容器管理CLI
  • 高阶组件实现Button权限
  • 对 .NET线程 异常退出引发程序崩溃的反思
  • PowerShell部署Windows爬虫自动化方案
  • 玩转 InfluxDB 3:用 HTTP API 快速创建高效数据表
  • 【Linux】调试器gdb/cgdb的使用
  • 信号处理:信号产生
  • 张艺兴续约担任传音手机全球品牌代言人 携手共启创新征程
  • 企业级DDoS防护实战案例
  • 数字取证和网络安全:了解两者的交叉点和重要性
  • 什么是 Kafka 中的消息?它由哪些部分组成
  • 《设计模式之禅》笔记摘录 - 13.迭代器模式
  • JP3-4-MyClub后台前端(二)
  • leetcode 3479. 水果成篮 III 中等
  • 多端同步新解法:Joplin+cpolar联合通过开源设计实现跨平台无缝协作?
  • 【学习笔记之redis】删除缓存
  • vue3 el-select el-option 使用
  • 学习嵌入式之硬件——ARM体系
  • CubeFS存储(一)
  • 【前端开发】四. JS内置函数