【字节青训营-6】:Gorm的基础使用

本文为笔者参加字节青训营时听字节课时所做笔记。

一、Gorm、Kitex、Hertz三件套介绍

Gorm是一个已经迭代了10年的强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源拓展。Gorm 是一个流行的开源对象关系映射(ORM)库,用于 Go 语言(Golang)。它提供了一种简单、高效且易于使用的方式来操作数据库,将 Go 语言中的结构体(struct)映射到数据库中的表(table),并支持多种数据库操作,如增删改查(CRUD)。

Kitex是字节内部的Golang微服务RPC框架,具有高性能、强可拓展的主要特点,支持多协议并且拥有丰富的开源拓展。

Hertz是字节内部的HTTP框架,参考了其他开源框架(比如Gin)的优势,结合字节内部的需求,具有高易用性、高性能、高拓展性的特点。

二、Gorm使用

2.1 基础使用

下面的代码中update并不会生效,原因我推测应该是Gorm 在执行更新操作时需要一个主键字段来定位要更新的记录。如果没有主键字段,Gorm 可能无法正确执行更新操作。

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 如果 Gorm 没有找到正确的 TableName 方法,它会使用默认的表名规则,
// 即结构体名称的复数形式(Product -> products)。
// 因此,即使你定义了 TableName 方法,拼写错误也会导致 Gorm 忽略它。
type Product struct {
   
   
	//定义gorm的model
	Code  string
	Price uint
}

func (p Product) TableName() string {
   
   
	return "product" // 为model定义表名
}

func main() {
   
   
	//这里调用的是mysql的驱动去操作数据库
	db, err := gorm.Open(mysql.Open("mysqlname:password@tcp(127.0.0.1:3306)/database_name?charset=utf8&parseTime=True&loc=Local"),
		&gorm.Config{
   
   })
	if err != nil {
   
   
		panic("failed to connect database")
	}
	// 自动迁移表结构,在 Gorm 中,自动迁移功能(AutoMigrate)用于根据结构体定义同步表结构到数据库。
	db.AutoMigrate(&Product{
   
   })
	//使用指针可以避免不必要的内存拷贝,提高性能。
	//将一个结构体实例保存到数据库中。传入的 &Product{Code: "D43", Price: 100} 是一个指向结构体实例的指针。
	//传递一条数据的时候是对象,传递多条数据的时候是切片
	db.Create(&Product{
   
   Code: "D43", Price: 100}) //创建数据库
	var product Product
	//&product 是一个指针,Gorm 通过指针直接修改 product 的字段值,而不是返回一个新的副本。
	//first只能查询单条记录
	db.First(&product, 1)                 //根据整形主键进行查找
	db.First(&product, "code = ?", "D43") //查找code字段值为D43的记录

	//Model 方法指定要操作的模型,&product 是一个指针,Gorm 使用它来确定操作的模型
	db.Model(&product).Update("Price", 200)                                         //更新为200
	db.Model(&product).Updates(Product{
   
   Price: 200, Code: "F42"})                    //仅更新非零值字段
	db.Model(&product).Updates(map[string]interface{
   
   }{
   
   "Price": 200, "Code": "F42"}) //使用map可以达到更新零值的目的
	//db.AutoMigrate(&Product{})
	//db.Delete(&product, 1)
}

gorm的约定有:使用名为ID的字段作为主键(也就是如果结构体中有ID字段,那么会被gorm默认当成主键)、使用结构体的蛇形负数作为表名(没有定义TableName函数时)、字段名的蛇形作为列名、使用CreatedAt和UpdatedAt字段作为创建和更新时间。

GORM支持Mysql、SQLServer、PostgreSQL、SQLite等。

在这里插入图片描述

DSN 是 Data Source Name(数据源名称)的缩写,它是一个用于描述数据库连接信息的字符串。DSN 通常包含了连接数据库所需的用户名、密码、主机地址、端口、数据库名称以及其他连接参数。它在许多数据库驱动程序和框架中被广泛使用,用于简化数据库连接的配置。

DSN 的格式因数据库类型而异,但通常包括以下部分:
1、协议:指定使用的数据库协议(如 mysql://、postgres://、sqlite://、sqlserver:// 等)。
2、用户名和密码:用于认证的用户名和密码。
3、主机和端口:数据库服务器的地址和端口。
4、数据库名称:要连接的数据库名称。
5、其他参数:如字符集、超时时间等。

比如Mysql的DSN示例:
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

比如sqlserver的示例:
dsn := "sqlserver://gorm:password@localhost:1433?database=gorm"

GORM是通过 驱动来连接数据库,如果需要连接其他类型的数据库,可以复用/自行开发驱动进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值