GORM连接数据库,并进行增删改查 | 青训营

66 阅读3分钟

安装

go get -u gorm.io/gorm 

连接到数据库

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

以连接mysql为例。

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

func main() {   
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情   
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) 
  sqlDB, err := db.DB()
  defer sqlDB.Close()
}

关于dsn:

  • user -> 用户名
  • pass -> 密码
  • 127.0.0.1 -> mysql默认本地地址,也就是localhost
  • 3306 -> mysql默认端口
  • dbname -> 数据库名称
  • charset -> 字符集编码
  • parseTime -> 把数据库datetime和date类型转换为golang的time.Time类型
  • loc -> 使用系统本地时区

使用 db.DB() 方法,我们获取了底层的 *sql.DB 对象 sqlDB。在 GORM 中,db.DB() 用于返回 *sql.DB 对象,它是底层数据库操作的核心对象。

声明模型

type Video struct {
	VideoId       int64 `gorm:"primaryKey"`
	UserId        int64
	PlayUrl       string
	CoverUrl      string
	FavoriteCount int64
	CommentCount  int64
	Title         string
	CreateAt      time.Time
	UpdateAt      *time.Time
	DeleteAt      *time.Time
}

GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAtUpdatedAt 字段追踪创建、更新时间。

例如:上述代码gorm会将其映射为

CREATE TABLE `video` (
  `video_id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint DEFAULT NULL,
  `play_url` varchar(255) DEFAULT NULL,
  `cover_url` varchar(255) DEFAULT NULL,
  `favorite_count` bigint DEFAULT NULL,
  `comment_count` bigint DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `create_at` datetime DEFAULT NULL,
  `update_at` datetime DEFAULT NULL,
  `delete_at` datetime DEFAULT NULL,
  PRIMARY KEY (`video_id`)
) 

而结构体中以小字母开头的字段则不会出现。

自定义生成的表结构

  • 表名 :实现Tabler接口中的TableName函数。
  • 字段名以及数据类型:字段后面打上gorm tag。

tag有很多用途,比如标记主键,指定not null等等,具体可以看官方文档。

创建表

GORM 的 AutoMigrate() 方法用于自动迁移 ORM 的 Schemas。所谓 “迁移” 就是刷新数据库中的表格定义,使其保持最新(只增不减)。

AutoMigrate 会创建(新的)表、缺少的外键、约束、列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改的话)。但不会删除未使用的列,以保护现存的数据。

db.AutoMigrate(&Video{})

创建记录

Video := Video{
		Name:           Videoname,
		Password:       password,
		FollowingCount: 0,
		FollowerCount:  0,
		CreateAt:       time.Now(),
	}
result := db.Create(&video)

查找记录

var videos []*Video
err := db.Where("user_id = ?", userId).Find(&videos).Error

更新记录

err := db.Model(&Video{}).Where("video_id=?", videoId).Update("comment_count", gorm.Expr("comment_count+?", cnt)).Error

删除记录

删除一条记录时,删除对象需要指定主键,否则会触发批量删除。例如:

db.Where("video_id = ?", videoId).Delete(&Video)

上述代码指定对vide_id =videId的记录进行删除。

GORM的作用:

  1. 简化数据库操作: GORM 提供了一种更直观和简单的方式来执行数据库操作,使开发人员可以使用面向对象的语法,而不需要编写大量的 SQL 查询语句。
  2. 提高开发效率: 使用 GORM 可以减少手动编写 SQL 查询和处理数据库连接的工作量,从而提高开发效率。
  3. 避免 SQL 注入: GORM 会自动将参数化查询应用到 SQL 查询中,从而减少 SQL 注入的风险。
  4. 数据库无关性: GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite 等,使得应用程序在不同数据库之间切换更加容易。
  5. 模型定义: GORM 允许你通过结构体定义数据模型,从而将数据库表映射到 Go 的结构体上。

参考

Gorm官方文档: GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

Go 语言编程 — gorm 数据库版本迁移