Gorm を使用してデータベースを操作する場合、特定の操作の実行前または実行後に追加の処理が必要になる状況が発生する場合があります。このとき、Gorm が提供する Hook と Session を使用して実現できます。この記事では、Gorm のフックとセッション関連のコンテンツを紹介します。
- 針
フックとは、特定の操作が実行される前または後に、追加の処理のためにいくつかのメソッドを自動的に呼び出すメカニズムを指します。たとえば、データを保存する前に、データに対して前処理や検証を行う必要がある場合があります。
Gorm は次の 7 つのフック関数を提供します。
- BeforeSave: モデルを保存する前に呼び出されます
- BeforeCreate: モデルを作成する前に呼び出されます
- AfterCreate: モデルの作成後に呼び出されます
- BeforeUpdate: モデルを更新する前に呼び出されます
- AfterUpdate: モデルの更新後に呼び出されます
- BeforeDelete: モデルを削除する前に呼び出されます
- AfterDelete: モデルが削除された後に呼び出されます
BeforeSave の例を次に示します。
type User struct {
ID int64 `gorm:"primary_key"`
Name string `gorm:"not null;unique"`
}
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
if u.Name == "" {
return errors.New("Name is required")
}
return nil
}
この例では、User 構造体を定義し、それに BeforeSave フック関数を追加します。BeforeSave 関数では、ユーザー名が空かどうかを確認しました。空の場合はエラーを返します。
保存操作を実行すると、BeforeSave 関数が自動的にトリガーされます。エラーが検出された場合、保存操作は失敗し、適切なエラー メッセージが表示されます。
- セッション
セッションとは、1 つのトランザクションで複数のデータベース操作を実行でき、トランザクション全体をロールバックしたり、すべての変更をコミットしたりできるメカニズムを指します。Gorm は、 Session をサポートするためにdb.Begin()
や などのメソッドを提供しますtx.Commit()
。
func UpdateUserAndArticle(user *model.User, article *model.Article) error {
tx := db.Begin()
if err := tx.Error; err != nil {
return err
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Save(user).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Save(article).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
この例では、最初にトランザクションを開き、次にユーザーと記事をそれぞれ保存しました。保存操作が失敗した場合、トランザクション全体が自動的にロールバックされます。
最後に、すべての操作が完了したら、tx.Commit()
メソッドを使用してすべての変更をデータベースにコミットします。
要約する
フックとセッションは Gorm の 2 つの非常に重要な機能です。これらを使用することで、データへのアクセスと変更プロセスをより柔軟に制御できます。もちろん、実際の応用においては、状況に応じて柔軟に使用し、さまざまな異常事態に合理的に対処する必要があります。