实践:使用GORM连接数据库 | 青训营

137 阅读9分钟

使用GORM连接数据库

GORM是一个使用Go语言编写的ORM框架。

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

如何使用GORM连接数据库,并实现增删改查CURD操作?下面我们来实践操作一下。

安装

go get -u gorm.io/gorm

连接数据库

想要连接数据库,我们还需要引入对应的数据库 driver,以下为各个数据库的引入地址,之后使用 Open() 方法来开启一个数据库连接。

"gorm.io/driver/mysql"          //MySQL
"gorm.io/driver/postgres"       //PostgreSQL
"gorm.io/driver/sqlite"         //SQLite
"gorm.io/driver/sqlserver"      //SQL Server

连接MySQL

连接MySQL数据库的步骤如下:

  1. 导入GORM库和MySQL驱动:
import (
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
)
  1. 创建数据库连接:
dsn := "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    // 处理错误
}

其中,user是MySQL用户名,password是密码,127.0.0.1:3306是MySQL服务器的地址和端口,database是要连接的数据库名。

  1. 定义数据模型:
type User struct {
    gorm.Model
    Name string
    Age  int
}
  1. 迁移数据表:
db.AutoMigrate(&User{})

这会自动创建一个名为users的数据表,用于存储User模型的数据。

  1. 进行数据库操作:
// 创建数据
user := User{Name: "Alice", Age: 20}
db.Create(&user)

// 查询数据
var result User
db.First(&result, 1) // 根据ID查询第一条记录

// 更新数据
db.Model(&result).Update("Age", 25)

// 删除数据
db.Delete(&result)

连接SQL Server

1. 导入GORM库和SQL Server驱动:

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

2. 创建数据库连接:

dsn := "sqlserver://username:password@localhost:1433?database=dbname"
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})
if err != nil {
    // 处理错误
}

其中,username是SQL Server用户名,password是密码,localhost:1433是SQL Server服务器的地址和端口,dbname是要连接的数据库名。

  1. 定义数据模型、迁移数据表、进行数据库操作与MySQL数据库一样。

定义数据模型

数据模型定义是指在GORM中定义结构体来表示数据库表。

在GORM中,可以使用结构体来定义数据模型。每个字段对应数据库表中的一个列。以下是一个示例:

type User struct {
    gorm.Model
    Name     string
    Age      int
    Email    string
    Password string
}

上面的代码定义了一个名为"User"的数据模型,包含了Name、Age、Email和Password四个字段。其中,Name、Age、Email和Password分别对应了数据库表中的四个列。gorm.Model是GORM提供的内置模型,用于自动管理常见字段,如ID、CreatedAt、UpdatedAt和DeletedAt。

可以根据实际需求在结构体中添加更多的字段和标签。标签可以用于指定数据库表的列名、数据类型、约束等信息,以便与数据库进行正确的映射。

例如,可以使用标签来指定列名和数据类型:

type User struct {
    gorm.Model
    Name     string `gorm:"column:name"`
    Age      int    `gorm:"column:age"`
    Email    string `gorm:"column:email"`
    Password string `gorm:"column:password"`
}

上面的代码中,使用gorm:"column:name"标签将Name字段映射到名为"name"的数据库列。可以根据需要添加更多的标签来指定其他信息,如数据类型、约束等。

标签是用反引号 ` 来定义的,放置在字段的后面。以下是一些常用的标签及其用法:

1. column 标签:用于指定字段在数据库表中的列名。

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"column:user_name"`
    Age  int    `gorm:"column:age"`
}

2. type 标签:用于指定字段在数据库中的数据类型。

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"type:varchar(50)"`
    Age  int    `gorm:"type:int"`
}

3. size 标签:用于指定字段在数据库中的大小限制,仅对字符串字段有效。

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"size:100"`
}

4. default 标签:用于指定字段在数据库中的默认值。

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"default:'Unknown'"`
    Age  int    `gorm:"default:18"`
}

5. unique 标签:用于指定字段是否要创建唯一约束。

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"unique"`
}

迁移数据表

在GORM中,可以使用AutoMigrate()方法来迁移数据表,它会根据数据模型自动创建或更新数据库表结构。要迁移数据表,首先需要创建数据库连接,然后调用AutoMigrate()方法,并传入相应的数据模型。

在执行 AutoMigrate() 方法后,GORM会自动检查数据库并根据数据模型定义创建或更新表结构。如果表不存在,则会创建相应的表;如果表已存在,则会检查字段的变化并进行更新。

需要注意的是,在进行数据迁移时,GORM会根据数据模型的定义来创建相应的表结构,但不会保留已有的数据。如果需要保留已有数据,请在迁移前备份数据或使用适当的迁移策略。

在实际开发中,可以根据需要进行多次迁移,以便添加新的数据模型或更新表结构。可以根据具体情况在 AutoMigrate() 方法中传入多个数据模型来进行迁移。

db.AutoMigrate(&User{}, &Product{}, &Order{})

以上代码将同时迁移 UserProduct 和 Order 三个数据模型对应的数据表。通过迁移数据表,可以方便地管理数据库表结构,确保数据模型与数据库的一致性,简化数据库操作。

数据库操作

在GORM中进行数据库操作主要涉及以下几个常用的操作:创建数据、查询数据、更新数据和删除数据。

创建数据

要在GORM中创建数据,可以使用Create()方法。以下是一个示例代码:

user := User{Name: "Alice", Age: 20}
db.Create(&user)

在上述代码中,我们创建了一个名为userUser结构体对象,并使用Create()方法将其保存到数据库中。&user表示传递user的指针给Create()方法。

需要确保数据库连接db已经建立,并且User模型已经定义和迁移。

Create()方法会将数据插入到数据库表中,并在插入成功后,自动更新模型对象的ID字段和其他可能的时间戳字段(如CreatedAt)。

在创建数据时,GORM会自动为模型对象生成一个唯一的ID,如果模型中定义了gorm.Model,则会自动包含IDCreatedAtUpdatedAtDeletedAt字段。

需要注意的是,在创建数据时,应该检查错误并进行适当的错误处理。例如:

if err := db.Create(&user).Error; err != nil {
    // 处理错误
}

在错误处理中,可以根据具体的业务需求,选择合适的方式进行错误处理,如返回错误信息、记录日志等。

查询数据

在GORM中,可以使用First()Find()Where()等方法来查询数据。以下是一些示例代码:

1. 查询单条记录:

var user User
db.First(&user, 1)

上述代码使用First()方法查询User模型中ID为1的记录,并将结果保存到user变量中。

2. 查询多条记录:

var users []User
db.Find(&users)

上述代码使用Find()方法查询User模型的所有记录,并将结果保存到users切片中。

3. 条件查询:

var user User
db.Where("age > ?", 18).First(&user)

上述代码使用Where()方法添加条件,查询age大于18的第一条记录,并将结果保存到user变量中。

  1. 排序查询:
var users []User
db.Order("age desc").Find(&users)

上述代码使用Order()方法指定按照age字段降序排序,查询所有User记录,并将结果保存到users切片中。

需要注意的是,在查询数据时,应该检查错误并进行适当的错误处理。例如:

var user User
if err := db.First(&user, 1).Error; err != nil {
    // 处理错误
}

更新数据

在GORM中更新数据,可以使用Model()Update()方法。以下是一个示例代码:

var user User
db.First(&user, 1) // 查询要更新的记录

user.Age = 25 // 修改数据

db.Model(&user).Update("Age", user.Age) // 执行更新操作

在上述代码中,我们首先使用First()方法查询ID为1的记录,并将结果保存到user变量中。然后,我们修改了user对象的Age字段值为25。

接下来,我们使用Model()方法传入&user来指定要更新的模型对象,并使用Update()方法来执行更新操作。在Update()方法中,我们传入要更新的字段名和字段值,这里是"Age"user.Age

需要注意的是,在使用Update()方法更新数据时,GORM会自动根据模型对象的主键(通常是ID字段)来确定要更新的记录。因此,在更新数据之前,我们需要确保user对象的主键字段的值是正确的。

另外,如果只需更新模型对象的部分字段,还可以使用Updates()方法。以下是一个示例代码:

db.Model(&user).Updates(User{Age: 25, Name: "Bob"})

在上述代码中,我们使用Updates()方法传入要更新的字段和对应的新值来更新数据。这里我们更新了AgeName字段。

在更新数据时,同样需要检查错误并进行适当的错误处理。例如:

if err := db.Model(&user).Update("Age", user.Age).Error; err != nil {
    // 处理错误
}

删除数据

在GORM中,可以使用Delete()方法来删除数据。以下是一个示例代码:

var user User
db.First(&user, 1) // 查询要删除的记录

db.Delete(&user) // 执行删除操作

在上述代码中,我们首先使用First()方法查询ID为1的记录,并将结果保存到user变量中。

接下来,我们使用Delete()方法传入&user来执行删除操作。GORM会根据模型对象的主键(通常是ID字段)来确定要删除的记录。

需要注意的是,在执行删除操作时,GORM只是标记了要删除的记录,而不是立即从数据库中删除。实际的删除操作将在事务提交时执行。

另外,可以通过Where()方法添加条件来进行有条件的删除操作。以下是一个示例代码:

db.Where("age > ?", 30).Delete(&User{})

在上述代码中,我们使用Where()方法添加条件,删除age大于30的所有记录。

在删除数据时,同样需要检查错误并进行适当的错误处理。例如:

if err := db.Delete(&user).Error; err != nil {
    // 处理错误
}