데이터 시드 및 일괄 데이터 작업 실행

Firebase Data Connect에서는 대량 데이터 작업이 변형을 사용하여 실행됩니다. Data Connect 프로젝트가 PostgreSQL에 데이터를 저장하더라도 SQL 문이나 SQL 도구를 사용하여 데이터를 일괄 로드할 수는 없습니다. Data Connect 서비스와 스키마는 데이터베이스와 동기화되어야 하며 PostgreSQL에서 직접 작업하면 이 동기화가 중단됩니다.

이러한 이유로 Data Connect는 시드 데이터 및 일괄 데이터 관리를 위해 표준 _insertMany, _upsertMany, _deleteMany 변형을 제공합니다.

앱 프로토타입을 만들고 CI/CD 흐름을 실행할 때 이러한 변형은 VS Code 확장 프로그램, Data Connect 에뮬레이터, (선택적으로) 로컬 데이터베이스 인스턴스를 사용하여 로컬 개발 환경에서 호출할 수 있습니다.

로컬 및 프로덕션 인스턴스에 데이터 시드

시작 가이드에서는 임시 삽입 변형을 사용하여 단일 테이블에 단일 레코드를 추가하도록 앱을 설정했습니다.

영화 리뷰 앱을 사용하려면 현실적인 데이터가 포함된 여러 테이블에서 조인 및 기타 작업을 사용하는 쿼리 및 변형의 프로토타입을 제작하기 위한 영화, 리뷰, 사용자 데이터가 필요합니다. 스키마를 확장하고 데이터베이스를 시드할 수 있습니다.

프로토타입 환경에는 데이터 시드를 실행하는 코드가 필요합니다. 이 가이드에서는 다음을 보여주는 몇 가지 샘플을 제공합니다.

  • 개별 테이블에서 _insertMany_upsertMany 사용
  • 관련 테이블에서 _insertMany 사용

영화 리뷰 앱 스키마 업데이트

_insertMany_upsertMany 변형을 사용하여 개별 데이터베이스 테이블을 한 번에 하나씩 업데이트하거나 조인 관계로 연결된 여러 테이블을 업데이트할 수 있습니다. 이러한 사용 사례와 예시를 설명하는 데 도움이 되는 확장된 영화 리뷰 앱 스키마는 아래에 나와 있습니다. schema.gql를 시작 Movie 유형을 넘어 ActorMovieActor 유형을 포함하도록 확장하여 더 복잡한 쿼리의 프로토타입을 만들 수 있습니다.

# Actors
# Suppose an actor can participate in multiple movies and movies can have multiple actors
# Movie - Actors (or vice versa) is a many to many relationship
type Actor @table {
  id: UUID!
  imageUrl: String! 
  name: String! @col(name: "name", dataType: "varchar(30)")
}

# Join table for many-to-many relationship for movies and actors
# The 'key' param signifies the primary key(s) of this table
# In this case, the keys are [movieId, actorId], the generated fields of the reference types [movie, actor]
type MovieActor @table(key: ["movie", "actor"]) {
  # @ref creates a field in the current table (MovieActor) that holds the primary key of the referenced type
  # In this case, @ref(fields: "movieId", references: "id") is implied
  movie: Movie!
  # movieId: UUID! <- this is created by the implied @ref
  actor: Actor!
  # actorId: UUID! <- this is created by the implied @ref
  role: String! # "main" or "supporting"
}

제로 스테이트 데이터를 시드하기 위해 변형 쓰기

프로토타입 제작 중에 쿼리와 변형을 여러 개별 값에 대해 테스트해야 하는 경우 데이터를 여러 레코드로 채울 수 있습니다. 예를 들어 테스트 비교와 필터링을 위해 다양한 유형의 장르와 평점이 포함된 여러 영화 레코드를 추가할 수 있습니다.

MovieActor 테이블에 시드 데이터 추가

프로토타입 제작 단계에 따라 시작 가이드에서 소개한 것과 동일한 기법을 사용하여 레코드 1~2개를 삽입할 수 있습니다. 즉, VS Code 확장 프로그램의 Code Lens를 사용하여 _insert 변형을 만들고, 데이터를 하드코딩하고, VS Code에서 이러한 변형을 실행할 수 있습니다.

결국 _insertMany 연산을 사용하여 테이블에 여러 레코드를 추가하는 것이 좋습니다. 영화 리뷰 앱 예에서는 MovieActor에 초기 데이터 세트를 삽입합니다.

다음 변형을 실행하려면 VS Code Firebase 확장 프로그램을 사용하여 적절한 파일 편집기 뷰에서 프로덕션 서비스 또는 로컬 데이터베이스로 프로토타입을 만드는지에 따라 Run (Production) 또는 Run (Local) CodeLens 버튼을 클릭합니다.

# insertMany for Movie
# 2 records shown
mutation {
  movie_insertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
  ])
}
# insertMany for Actor
# 2 records shown
mutation {
  actor_insertMany(data: [
    {
      id: "123e4567-e89b-12d3-a456-426614174000",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
      name: "Leonardo DiCaprio"
    },
    {
      id: "123e4567-e89b-12d3-a456-426614174001",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
      name: "Keanu Reeves"
    }
   ])
}

MovieActor 조인 테이블에 데이터 시드

조인 및 기타 복잡한 작업을 사용하여 쿼리와 변형을 테스트하려면 MovieActor 테이블에 여러 레코드를 추가하면 됩니다.

여기에서 이러한 종류의 관계에서 여러 테이블을 업데이트할 때 @transaction 지시문을 추가하여 업데이트가 올바르게 완료되도록 할 수 있습니다.

mutation @transaction {
  movie_insertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
  ])

  actor_insertMany(data: [
    {
      id: "123e4567-e89b-12d3-a456-426614174000",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fdicaprio.jpeg?alt=media&token=452e030a-efa5-4ef4-bb81-502b23241316",
      name: "Leonardo DiCaprio"
    },
    {
      id: "123e4567-e89b-12d3-a456-426614174001",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/actors%2Fkeanu.jpg?alt=media&token=6056520c-ef3e-4823-aad0-108aab163115",
      name: "Keanu Reeves"
    }
  ])
}

시드 데이터를 재설정하는 변형 작성

프로토타입을 만들고 CI/CD를 실행하는 동안 새 데이터 세트에서 새로운 테스트를 실행하기 위해 데이터를 0 상태로 재설정하는 것이 유용할 수 있습니다.

이렇게 하려면 프로토타입 코드가 테이블에 레코드를 추가하지 않는 경우 Data Connect에서 제공하는 _upsertMany 변형을 사용하세요.

다음 예에서는 초기 값을 사용하여 movie_upsertMany가 호출되어 영화 레코드를 원래 상태로 업데이트합니다.

mutation {
  # Execute an upsertMany operation to update the Movie table
  movie_upsertMany(data: [
    {
      id: "550e8400-e29b-41d4-a716-446655440000",
      title: "Inception",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Finception.jpg?alt=media&token=07b09781-b302-4623-a5c3-1956d0143168",
      genre: "sci-fi",
    },
    {
      id: "550e8400-e29b-41d4-a716-446655440001",
      title: "The Matrix",
      imageUrl: "https://firebasestorage.googleapis.com/v0/b/fdc-quickstart-web.appspot.com/o/movies%2Fthe_matrix.jpg?alt=media&token=4975645d-fef8-409e-84a5-bcc1046e2059",
      genre: "action",
    }
   
}

다음 단계