Go 语言流行 ORM 框架

欢迎关注我的公众号:程序员技术成长之路

ORM,全称 Object-Relational Mapping,即对象-关系映射,是一种程序设计技术,用于实现面向对象编程语言里对象的表现形式与关系数据库中数据的存储之间的转换。

在实际工作中,我们使用程序操作对象,然后通过对象与数据库之间的映射关系,可以使得我们不再操作 SQL,而是操作程序中的对象,将数据库中的数据映射为对象,这样可以大大提高开发效率,使开发者能够更专注于业务逻辑的实现。

具体来说,比如我们有一张 "用户" 表在 SQL 数据库中,我们可以定义一个 "User" 的对象在我们的代码中,然后我们可以通过操作这个 "User" 对象来实现对 "用户" 表的操作。比如我们创建一个 "User" 对象并保存,实际上是在 "用户" 表中插入一条数据,我们删除一个 "User" 对象,实际上是删除 "用户" 表中的某条数据。

ORM框架就是封装了这种映射关系,提供了对数据库增删查改等操作的接口,让开发者更方便地操作数据库。例如,Java的Hibernate,Python的SQLAlchemy,GO语言的GORM。

一、GORM

github:github.com/go-gorm

GORM 是一个 Go 语言写的 ORM 库,通过使用它可以简洁地完成对数据库的操作。它支持关联(包括一对一,一对多和多对多)、钩子(在创建、更新、查询、删除之前或之后运行特定的代码)、预加载(即先加载相关的数据,再执行指定操作)、事务处理,以及自动迁移(只是自动创建表,修改字段,不会删除数据且不支持重命名)等功能。

首先,你需要安装 GORM。这可以通过运行以下命令完成:

arduino 复制代码
go get -u github.com/jinzhu/gorm

然后,你可以开始使用 GORM,如下就是一个简单的使用例子:

很好,假设我们已经拥有一个名为 user 的表,我们可以这样操作:

首先,定义 User 结构体:

go 复制代码
type User struct {
  gorm.Model
  Name         string `gorm:"type:varchar(255)"`
  Email        string `gorm:"type:varchar(100);"`
  Role         string `gorm:"type:varchar(255)"`
  MemberNumber string `gorm:"type:varchar(50)"`
}

// TableName sets the insert table name for this struct type
func (u *User) TableName() string {
  return "users"
}

在这个例子中,User 结构体就会映射到 "users" 表。你可以根据需要更改 TableName 函数返回的字符串,来改变 User 结构体对应的数据库表。

注意,如果不提供 TableName 方法,GORM 默认会将结构体名(首字母小写)加上一个 's'作为表名。比如 User 结构体默认对应的表名是 "users" 。

代码中连接数据库

go 复制代码
 db, err := gorm.Open("mysql", "root:root@/test?charset=utf8&parseTime=True&loc=Local")
  if err != nil {
    panic("failed to connect to database")
  }
  defer db.Close()

接下来,进行表的迁移:

db.AutoMigrate(&User{})

sql 复制代码
user := User{Name: "Test User", Email: "testuser@email.com", Role: "admin", MemberNumber: "123456"}
db.Create(&user)

sql 复制代码
var user Userdb.First(&user, 1) // 找ID为1的用户
db.First(&user, "name = ?", "Test User") // 找名字为Test User的用户

sql 复制代码
db.Model(&user).Update("Email", "newemail@email.com")

scss 复制代码
db.Delete(&user)

二、XORM

github:github.com/go-xorm/xor...

XORM 是一个简单且强大的 Go 语言 ORM 库,支持 MySQL, PostgreSQL, SQLite3, SqlServer, Oracle 的数据库操作。包含了基本的数据操作(CRUD)、事务处理、缓存及会话等功能。

首先,你需要安装 XORM。这可以通过运行以下命令完成:

arduino 复制代码
go get xorm.io/xorm

然后,你可以开始使用 XORM,下面是一个简单的使用例子:

go 复制代码
package main

import (
  "fmt"
  _ "github.com/go-sql-driver/mysql"
  "xorm.io/xorm"
)

type User struct {
  Id int `xorm:"pk autoincr"`
  Name string
  Email string
  Role string
  MemberNumber string
}

func main() {
  engine, err := xorm.NewEngine("mysql", "root:root@/test?charset=utf8")
  if err != nil {
    fmt.Println("Database connection failed: ", err)
    return
  }

  // 同步结构体到数据库中
  err = engine.Sync2(new(User))
  if err != nil {
    fmt.Println("Database sync failed: ", err)
    return
  }

  // 插入
  u := User{Name: "Test", Email: "test@abc.com", Role: "admin", MemberNumber: "123456"}

  _, err = engine.Insert(&u)
  if err != nil {
    fmt.Println("Insert failed: ", err)
    return
  }

  // 查询
  users := make([]User, 0)
  err = engine.Find(&users)
  if err != nil {
    fmt.Println("Find failed: ", err)
    return
  }

  fmt.Println("Users: ", users)

  _, err = engine.ID(u.Id).Delete(&u)
  if err != nil{
    fmt.Println("Delete failed: ", err)
    return
  }

}
相关推荐
IT爱学堂13 分钟前
Go开发疑难杂症终结者通关指南
后端
大勇前进24 分钟前
从10分钟到10秒:一个真实慢查询的SQL Server优化全记录
后端
站大爷IP25 分钟前
被Python异步坑了三年,才搞懂await和create_task的区别
后端
大白8025 分钟前
你的数据库密码还在用明文?SQL Server 凭据管理的 3 种现代方案
后端
凤山老林25 分钟前
Spring Boot 集成 ShardingSphere-Encrypt 实现字段级实时脱敏
java·spring boot·后端·数据脱敏
vipxieliang25 分钟前
ValidX v1.2.0 更新日志
java·后端
Zane199433 分钟前
只改一个方向的引用,循环引用就能立刻被回收?一文讲透 weakref 弱引用
后端·python
长大198833 分钟前
窗口函数用不好反而更慢?SQL Server中OVER子句的4个性能陷阱
后端
大黄评测33 分钟前
MERGE语句有Bug?SQL Server官方不推荐的背后真相与替代方案
后端
长大198835 分钟前
TempDB 爆满导致系统卡死?SQL Server TempDB 瓶颈诊断与根治方案
后端