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:latest
    container_name: postgresql
    restart: unless-stopped
    environment:
      # 必需:设置 PostgreSQL 的超级用户密码
      - POSTGRESQL_PASSWORD=andrew

      # 可选:设置其他配置
      - POSTGRESQL_USERNAME=andrew
      - POSTGRESQL_DATABASE=dbdata
      - POSTGRESQL_POSTGRES_PASSWORD=andrew  # 为 postgres 用户设置密码

    volumes:
      # 将主机目录挂载到容器内的持久化路径
      # 宿主机路径:~/docker/postgresql
      # 容器内部路径:/bitnami/postgresql
      - ~/docker/postgresql:/bitnami/postgresql

    ports:
      # 映射 PostgreSQL 默认端口(可选)
      - "5432:5432"

    # 可选:设置资源限制
    # deploy:
    #   resources:
    #     limits:
    #       memory: 512M
    #     reservations:
    #       memory: 256M

    # 可选:健康检查
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
      interval: 10s
      timeout: 5s
      retries: 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 的内置约定非常有用,请参阅嵌入式结构体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andrewbytecoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值