>  기사  >  백엔드 개발  >  GORM에서 FirstOrCreate()와 FirstOrInit()를 언제 사용해야 합니까?

GORM에서 FirstOrCreate()와 FirstOrInit()를 언제 사용해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-12 03:45:01898검색

When Should I Use FirstOrCreate() vs. FirstOrInit() in GORM?

GORM을 사용하여 레코드 생성 또는 업데이트

GORM은 데이터베이스의 레코드를 관리하는 두 가지 방법인 FirstOrCreate() 및 FirstOrInit()를 제공합니다. 그러나 때로는 레코드 생성과 업데이트를 구별해야 하는 시나리오가 발생할 수 있습니다.

레코드 생성 확인

FirstOrCreate()는 레코드 기반 레코드 찾기를 시도합니다. 지정된 기준에 따라. 존재하는 경우 기존 레코드를 반환합니다. 존재하지 않는 경우 새 레코드를 생성하고 새로 생성된 레코드를 반환합니다.

레코드가 실제로 생성되었는지 확인하려면 트랜잭션에서 Create 메서드를 사용하면 됩니다. 거래가 성공하면 기록이 생성됩니다. 트랜잭션이 실패하면 해당 레코드가 이미 존재하고 생성되지 않았다는 의미입니다.

func CreateOrUpdateRecord(tx *gorm.DB, record *Model) error {
    if err := tx.Create(record).Error; err != nil {
        return err // Record already exists
    }

    return nil // Record created
}

Upsert with GORM

GORM 1.20.x부터 편리한 기능 "Upsert"라는 기능을 사용할 수 있습니다. 이는 호환 가능한 "Upsert-On-Conflect" 메커니즘을 제공하여 CreateOrUpdateRecord의 기능을 결합합니다.

// Update columns to new value on `id` conflict
tx.Clauses(clause.OnConflict{
    Columns:   []clause.Column{{Name: "id"}}, // key column
    DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), // columns needed to be updated
}).Create(&users)

이 쿼리는 다음과 같은 SQL 문으로 변환됩니다.

  • MERGE INTO... 일치하지 않을 때 삽입... 일치할 때 업데이트...(SQL Server)
  • INSERT INTO... ON CONFLICT(...) DO UPDATE SET...(PostgreSQL)
  • INSERT INTO... ON 중복 키 업데이트... (MySQL)

FirstOrInit 대 FirstOrCreate

FirstOrInit()에 유의하는 것이 중요합니다. FirstOrCreate()는 다른 용도로 사용됩니다. FirstOrInit()은 구조체를 초기화하지만 데이터베이스에 레코드를 생성하지 않습니다. 반면 FirstOrCreate()는 레코드를 생성한 다음 제공된 구조체에 쿼리합니다.

위 내용은 GORM에서 FirstOrCreate()와 FirstOrInit()를 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.