[ GORM | 青训营笔记 ]
- 明确指定模型名称和数据库表名称
在使用 GORM 时,尽量明确指定模型名称和数据库表名称,使用 TableName() 方法指定表名,使用 Model() 方法指定模型名称。这有助于避免表名和模型名称出现问题,以及 GORM 自动生成的 SQL 语句可能出现的不一致问题。
- 使用
Preload() 避免查询 N+1 问题
在进行关联查询时,使用 Preload() 方法可以避免 N+1 问题。 Preload() 方法可以在执行查询时使用 JOIN,一次性查询出所有关联结果,避免了数据交互的开销。
- 使用事务处理
在进行一系列数据库更新操作时,使用事务处理可以保证数据的一致性,同时也保证了操作的原子性。 在 GORM 中,可以使用 Begin() 方法启动一个事务,然后使用 Commit() 提交或使用 Rollback() 回滚事务。
- 使用批处理
在执行大量数据库更新时,使用 GORM 的批处理可以提高性能。 GORM 提供了 CreateInBatches()、UpdateInBatches() 和 DeleteInBatches() 等方法,这些方法可以一次性处理大量数据,避免多次往返数据库的交互。
- 使用 GORM-Migrate 自动管理数据库
使用 GORM-Migrate 可以自动管理数据库。通过 GORM-Migrate,可以自动管理创建、修改和删除表格等操作。这样就可以避免人为管理数据库,保证数据库较为高效地运作。
- 使用软删除
在一般的数据库设计中,删除某些数据是不可逆转的操作,因此建议使用软删除(Soft Delete)来避免意外删除或数据丢失的风险,同时还可避免硬删除造成的数据空洞。GORM 提供了 Delete() 和 Unscoped().Delete() 两种方式对数据进行软删除和永久删除。
- 避免全局的 GORM 变量
在使用 GORM 时,应该避免在全局范围内创建一个共享的 GORM 对象,因为多个 Goroutines 之间可能会出现竞争的情况,导致数据不一致。为了避免这种情况,建议在每个 Goroutine 内部创建单独的 GORM 实例,以便进行数据库操作。
总之,在使用 GORM 时,需要明确指定模型名称和数据库表名称、使用 Preload() 避免查询 N+1 问题、使用事务处理、使用批处理和使用 GORM-Migrate 自动管理数据库等最佳实践,以提高性能并避免潜在的问题。