首页 > 其他分享 >go语言gorm

go语言gorm

时间:2023-07-24 21:57:56浏览次数:37  
标签:string int 约定 mysql go type gorm 语言

ORM

对象关系映射(Object Relational Mapping,ORM)。指的是对象和关系之间的映射,使用面向对象的 方式操作数据库。

关系模型和Go对象之间的映射
table => struct   ,表映射为结构体
row   => object   ,行映射为实例
column => property ,字段映射为属性

可以认为ORM是一种高级抽象,对象的操作最终还是会转换成对应关系数据库操作的SQL语句,数据库 操作的结构会被封装成对象。

GORM

GORM是一个友好的、功能全面的、性能不错的基于Go语言实现的ORM库。

GitHub:https://github.com/go-gorm/gorm

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

连接

 

package main

import (
    "fmt"
    "os"
    "time"
    "github.com/rs/zerolog/log"
    "gorm.io/driver/mysql" // 二次封装,底层依然依赖mysql驱动
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)

var db0 *gorm.DB

func init() {
    var err error
    dsn := "gopher:123456@tcp(172.***:3306)/gopher?charset=utf8&parseTime=True&loc=Local"
    db0, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info),
    })
    if err != nil {
        log.Err(err).Send()
    }
}

在"gorm.io/driver/mysql/mysql.go"中, import了 "github.com/go-sql-driver/mysql",也就是说驱动也导入了,Dialector的Initialize方法中使用了sql.Open

模型定义

GORM倾向于约定优于配置

  • 约定使用名为ID或Id的属性会作为主键
  • 约定使用snake_cases作为表名
  • 结构体命名为employee,那么数据库表名就是employees
  • 约定使用snake_case作为字段名,字段首字母大写采用大驼峰
  • 属性名为FirstName,默认对应数据库表的字段名为first_name

如果不遵从以上约定就要自定义配置

// 不符合约定的定义,很多都需要配置,直接用不行
type Emp struct { // 默认表名emps
 emp_no     int    // 不是ID为主键,需要配置
 first_name string // 首字母未大写,也需要配置
 last_name  string
 gender     byte
 birth_date string
}
// 符合约定的定义如下
type student struct { // 默认表名students
 ID   int    // Id也可以
 Name string // 字段首字母要大写
 Age  int
}
// 表明配置,表名并没有遵守约定
func (Emp) TableName() string {
return "employees"
}

使用 gorm:"primaryKey" 来指定字段为主键,默认使用名为ID的属性作为主键。primaryKey是tag名, 大小写不敏感,但建议小驼峰。如果未按照约定定义字段,需要定义结构体属性时指定数据库字段名称是什么。

type Emp struct {
    // 约定ID、Id为主键,整数自增
    Em_num    int       `gorm:"primaryKey;column:emp_no"` // 非约定,自定义
    Birth_day time.Time `gorm:"column:birth_date"`
    FirstName string // 首字母大写,对应字段first_name
    LastName  string
    Gender    uint8
    HireDate  time.Time
}

// 表名约定
func (Emp) TableName() string {
    return "employees"
}

迁移

下面是新建一个students表,结构体中属性类型和数据库表中字段类型的对应关系

// 迁移后,主键默认不为空,其他字段默认都是能为空的
type Student struct {
 ID       int       // 缺省主键bigint AUTO_INCREMENT
 Name     string    `gorm:"not null;type:varchar(48);comment:姓名"`
 Age      byte      // byte=>tinyint unsigned
 Birthday time.Time // datetime
 Gender   byte      `gorm:"type:tinyint"`
}
// db.Migrator().DropTable(&Student{})
db.Migrator().CreateTable(&Student{})
CREATE TABLE `students` (
    `id` bigint AUTO_INCREMENT,
    `name` varchar(48) NOT NULL COMMENT '姓名',
    `age` tinyint unsigned,
    `birthday` datetime(3) NULL,
    `gender` tinyint,
    PRIMARY KEY (`id`)
)

由于int => bigint、string => longtext,这些默认转换不符合我们的要求,所以,在tag中使用type指定 字段类型。 属性是用来构建结构体实例的,生成的SQL语句也要使用这些数据。而tag是用来生成迁移

Name     string     `gorm:"size:48"` 定义为varchar(48)
Age     int       `gorm:"size:32"` 定义为4字节的int
Age     int       `gorm:"size:64"` 定义为8字节的bigint

结构体属性类型用来封装实例的属性数据,Tag中类型指定迁移到数据库表中字段的类型。

 

标签:string,int,约定,mysql,go,type,gorm,语言
From: https://www.cnblogs.com/caibao666/p/17578039.html

相关文章

  • go install 和 go get的区别
    goinstall和goget都是Go语言中的命令行工具,用于处理依赖关系和安装包。它们的主要区别在于功能和使用场景。goinstall:功能:goinstall命令用于编译并安装指定的包或可执行程序到Go语言的工作空间(GOPATH)的bin目录下。如果没有指定包名,则会安装当前目录下的包或可......
  • 饮冰三年-人工智能-Django淘宝拾遗-85-常用的Python格式化工具
       Python代码格式化对于团队协作、代码质量、错误预防以及与Python社区的契合都具有重要意义。好的代码格式化不仅是一种编码规范,更是一种良好的编码习惯,有助于提高整个项目的质量和可维护性。   在团队中,可能有不同的编码规范和自定义的格式化规则。尽管有一些格式......
  • C语言分支与循环(7)--- do...while()循环
    一.do语句的语法do循环语句;while(表达式);我们可以发现do后面的循环语句一定会被执行一次,随后再去执行while()循环语句,去判断表达式,如果为真则返回do语句继续执行,若为假则不进入do语句循环,如以下代码:#include<stdio.h>intmain(void){ inti=0; do { printf("%d",i);......
  • 我的第五次C语言练习
    今天写书上的练习。//第一章练习//intmain(void)//{// intinch;// floatcm;// inch=0;// scanf("%d",&inch);// cm=2.54*inch;// printf("cm=%f\n",cm);// return0;//}发现之前第一章还有练习没写,是将英尺转换为厘米,因为inch乘了个2.54,所以cm是小数,用的是flo......
  • MongoDB 教程二: 添加, 删除,查询 shell命令
       MongoDBShell常用操作命令MonoDB shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的。 Ø数据库//1、Help查看命令提示helpdb.help();db.yourColl.help();db.youColl.find().help();rs.help();//2、切换/创建......
  • ssh unable to negotiate
    打开~/.ssh/config文件,在文件最开始添加以下配置并保存:Host*HostkeyAlgorithms+ssh-rsaPubkeyAcceptedAlgorithms+ssh-rsa  MacOSVentura系统ssh不再支持ssh-rsa的原因及解决办法https://blog.twofei.com/881/#solution......
  • 简单理解:C语言中的分支和循环语句
    一、C语言中的循环语句while循环while(//条件语句){//语句块}执行的逻辑:在执行到while()这一行时,会根据条件语句的真和假来判断是否继续进行循环,若条件语句为真则继续循环,如果条件为假则结束循环。dowhile循环do{//语句块}while(条件语句);执行的逻辑:和while类似,但是要注......
  • PyCharm 在PyCharm中运行Django测试的日志输出
    环境:Windows10  +PyCharm2022.3.3+ Djangoversion4.2.3via: https://docs.djangoproject.com/zh-hans/4.2/topics/logging/#configuring-logging 日志模块配置:在settings.py添加如下配置: importosLOGGING={"version":1,"disable_existi......
  • 需求前十的编程语言——唯独钟爱Python
    在过去的17个月(2022年1月至2023年5月)时间里,DevJobsScanner通过分析超1400万个开发人员职位,并从中筛选了有明确编程语言需求的职位,得出了在2023年需求量最大的8种语言。目前市场中需求最高的前八位语言分别是:1、JavaScript/TypeScript和以往一样,Javascript仍然......
  • Golang 规则引擎原理及实战
    本文主要介绍规则引擎在golang中的使用,将首先介绍golang中主要的规则引擎框架,然后利用golang原生的parser搭建一个简单的规则引擎实现基本的bool表达式解析工作。背景随着业务代码的不断迭代,诞生出了越来越多的if-else,并且if-else中的逻辑越来越复杂,导致代码逻辑复......