GORM简介

GORM是Go语言中一个流行的ORM(Object Relational Mapping)框架,它能够对数据库表和代码中的数据模型进行全自动映射,使用GORM框架相比直接使用database/sql包操作数据库更加方便。GORM的设计和许多其它语言流行的ORM框架类似,比如Python的Django ORM或是Laravel的Eloquent等,掌握一种后再学习GORM是十分轻松的。

官方文档:https://gorm.io/zh_CN/docs/index.html

项目Github地址:https://github.com/go-gorm/gorm

引入GORM依赖

我们需要使用go get命令安装GORM的依赖包,除此之外还需要安装数据库驱动,GORM提供了许多常用数据库的驱动,包括MySQL、PostgreSQL、Sqlite等,我们根据我们的需求安装对应的驱动即可。

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

虽然ORM框架在具体使用时会抹平底层细节,但不同的数据库驱动还是需要不同的配置方式来初始化,后续章节都以MySQL为例进行介绍,其它数据库参考文档进行配置即可。

GORM使用例子

GORM的用法其实很简单,我们这里直接看一个例子。下面代码我们定义了一个结构体Product作为数据模型,结构体的字段Tag中我们定义了GORM所需的一些属性用于自动创建表结构,随后我们使用GORM将一条数据保存到数据库中。

model/product.go

package models

import "time"

type Product struct {
    ProductId   uint64    `gorm:"type:bigint;column:product_id;primaryKey;autoIncrement"`
    ProductName string    `gorm:"type:varchar(200);column:product_name;not null"`
    CreateTime  time.Time `gorm:"type:datetime;column:create_time;not null"`
}

func (*Product) TableName() string {
    return "t_product"
}

数据模型包含3个字段:自增长主键,产品名,创建时间。其数据库中的数据类型分别为BIGINTVARCHAR(200)DATETIME

main.go

package main

import (
    "demoorm/models"
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "time"
)

func main() {
    // 初始化数据库连接
    dsn := "root:root@tcp(127.0.0.1:3306)/netstore?charset=utf8mb4&parseTime=true&loc=Local"
    conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    // 创建并执行数据迁移
    err = conn.AutoMigrate(&models.Product{})
    if err != nil {
        panic(err)
    }

    // 插入数据
    product := models.Product{ProductName: "Nvidia显卡", CreateTime: time.Now()}
    result := conn.Create(&product)

    // 打印SQL执行的影响行数
    fmt.Println(result.RowsAffected)
}

上面代码很简单,我们首先使用gorm.Open()方法初始化了GORM,它返回一个*DB指针。注意这步在实际开发中在程序启动时执行1次即可,类似标准库的database/sql,GORM在底层也维护了数据库连接池,我们没必要多次初始化。随后我们执行了数据迁移,GORM框架会根据模型的字段定义自动建表。最后我们创建了一个结构体的实例,然后调用了Create()方法将其保存到数据库中,它的参数是具体数据模型实例的指针,GORM底层会根据数据模型的Tag自动进行结构体字段到数据库表字段的映射。插入后我们读取了执行SQL影响的数据记录行数并打印了出来。如果这里想获取插入数据的主键,直接读取product.ProductId即可。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap