Tạo dữ liệu ban đầu và thực hiện các thao tác dữ liệu hàng loạt

Trong Firebase SQL Connect, bạn có thể thực hiện việc tải và cập nhật dữ liệu hàng loạt theo nhiều cách tuỳ thuộc vào quy trình làm việc và môi trường của mình:

  • Trong quá trình tạo mẫu cục bộ, khi bạn đang thử các giản đồ thay thế, bạn có thể tạo và gọi các đột biến gieo dữ liệu trong môi trường phát triển cục bộ bằng cách sử dụng tiện ích SQL Connect VS Code, trình mô phỏng SQL Connect và thực thể cơ sở dữ liệu cục bộ.

  • Trong quá trình phát triển sản xuất, với giản đồ ổn định, khi bạn đang thực hiện các luồng CI/CD lớn hơn và quản lý dữ liệu sản xuất, bạn có 2 lựa chọn:

    • Phương pháp ưu tiên là sử dụng Firebase Admin SDK, một tập hợp các thư viện chạy trong môi trường đặc quyền.

    • Bạn cũng có thể sử dụng các công cụ SQL với thực thể Cloud SQL của mình để thực hiện việc tải và cập nhật hàng loạt, miễn là bạn đang sửa đổi dữ liệu chứ không phải giản đồ cơ sở dữ liệu. Việc sửa đổi trực tiếp giản đồ cơ sở dữ liệu bằng các công cụ SQL có thể làm hỏng giản đồ SQL Connect và trình kết nối.

Tạo mẫu cục bộ: gieo dữ liệu trong các thực thể cục bộ

Trong Hướng dẫn bắt đầu, bạn thiết lập một ứng dụng để thêm một bản ghi vào một bảng bằng cách sử dụng đột biến chèn đặc biệt.

Để có thể sử dụng được, ứng dụng đánh giá phim cần dữ liệu về phim, bài đánh giá và người dùng để tạo mẫu các truy vấn và đột biến sử dụng các phép nối và các thao tác khác trên nhiều bảng có dữ liệu thực tế. Bạn có thể mở rộng giản đồ và gieo cơ sở dữ liệu.

Môi trường tạo mẫu của bạn cần có mã để thực hiện việc gieo dữ liệu. Hướng dẫn này cung cấp một số mẫu minh hoạ:

  • Sử dụng _insertMany_upsertMany trên các bảng riêng lẻ
  • Sử dụng _insertMany trên các bảng có liên quan

Cập nhật giản đồ ứng dụng đánh giá phim

Bạn có thể sử dụng các đột biến _insertMany_upsertMany để cập nhật từng bảng cơ sở dữ liệu một hoặc cập nhật nhiều bảng có liên quan theo mối quan hệ nối. Dưới đây là giản đồ ứng dụng đánh giá phim mở rộng giúp minh hoạ các trường hợp sử dụng và ví dụ này. Giản đồ này mở rộng schema.gql vượt ra ngoài loại Movie ban đầu để bao gồm các loại ActorMovieActor, nhờ đó chúng ta có thể tạo mẫu các truy vấn phức tạp hơn.

# 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"
}

Viết các đột biến để gieo dữ liệu ở trạng thái ban đầu

Trong quá trình tạo mẫu, khi các truy vấn và đột biến cần được kiểm thử dựa trên một loạt giá trị riêng biệt, bạn có thể điền dữ liệu bằng nhiều bản ghi. Ví dụ: bạn có thể muốn thêm nhiều bản ghi phim với nhiều thể loại và điểm xếp hạng để kiểm thử so sánh và lọc.

Gieo dữ liệu vào các bảng MovieActor

Tuỳ thuộc vào giai đoạn tạo mẫu, bạn có thể sử dụng cùng một kỹ thuật được giới thiệu trong Hướng dẫn bắt đầu để chèn một hoặc hai bản ghi: tức là bạn có thể sử dụng CodeLenses trong tiện ích SQL Connect VS Code để tạo các đột biến _insert, mã hoá cứng dữ liệu và Chạy các đột biến đó trong VS Code.

Cuối cùng, bạn nên thêm nhiều bản ghi vào một bảng bằng thao tác _insertMany. Trong ví dụ về ứng dụng đánh giá phim, thao tác này sẽ chèn một tập hợp dữ liệu ban đầu vào MovieActor.

Để thực thi các đột biến sau, hãy sử dụng tiện ích SQL Connect VS Code, trong chế độ xem trình chỉnh sửa tệp thích hợp, hãy nhấp vào nút CodeLens Chạy (Sản xuất) hoặc Chạy (Cục bộ), tuỳ thuộc vào việc bạn đang tạo mẫu bằng dịch vụ sản xuất hay cơ sở dữ liệu cục bộ.

# 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"
    }
   ])
}

Gieo dữ liệu vào bảng nối MovieActor

Để kiểm thử các truy vấn và đột biến bằng cách sử dụng các phép nối và các thao tác phức tạp khác, bạn có thể thêm nhiều bản ghi vào bảng MovieActor.

Tại đây, khi bạn đang cập nhật nhiều bảng trong loại quan hệ này, bạn có thể thêm chỉ thị @transaction để đảm bảo quá trình cập nhật hoàn tất đúng cách.

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"
    }
  ])
}

Để gieo các bảng có liên quan một cách nguyên tử, bạn có thể thực hiện thao tác chèn quan hệ lồng nhau bằng cách sử dụng tải trọng theo nghĩa đen. Thao tác này sẽ tạo bản ghi gốc và các bản ghi con được liên kết với bản ghi đó trong một thao tác duy nhất mà không cần tương quan khoá ngoại theo cách thủ công.

# Nested insert for Movie and Review
# 1 movie and 2 reviews shown
mutation {
  movie_insert(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",
    reviews_on_movie: [
      {
        id: "123e4567-e89b-12d3-a456-426614174002",
        rating: 5,
        reviewText: "Amazing concept!",
        user: { id: "user-uuid-123" }
      },
      {
        id: "123e4567-e89b-12d3-a456-426614174003",
        rating: 4,
        reviewText: "A bit confusing, but great.",
        user: { id: "user-uuid-456" }
      }
    ]
  })
}

Viết một đột biến để đặt lại dữ liệu gieo

Trong quá trình tạo mẫu và thực hiện CI/CD, việc đặt lại dữ liệu về trạng thái ban đầu để thực thi một loạt thử nghiệm mới trên một tập hợp dữ liệu mới có thể hữu ích.

Để thực hiện việc này, nếu mã nguyên mẫu của bạn không thêm bản ghi vào các bảng, hãy sử dụng đột biến _upsertMany do SQL Connect cung cấp.

Trong ví dụ sau, movie_upsertMany được gọi bằng các giá trị ban đầu để cập nhật các bản ghi phim về trạng thái ban đầu.

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",
    }
   
}

Phát triển sản xuất: sử dụng Admin SDK để điền và cập nhật

Firebase Admin SDK có sẵn khi bạn muốn làm việc trong môi trường đặc quyền. Đây là một trường hợp sử dụng quan trọng khi bạn muốn tải hàng nghìn bản ghi, do tính chất quan trọng của các thao tác dữ liệu hàng loạt trên dữ liệu sản xuất.

Cài đặt Firebase Admin SDK

Ngay cả khi bạn chủ yếu làm việc cục bộ, Firebase vẫn khuyên bạn nên thiết lập Admin SDK để có thể sử dụng Firebase SQL Connect từ môi trường đặc quyền, bao gồm cả môi trường cục bộ. Bạn cần thiết lập Admin SDK cho Node.js.

Bạn có thể tìm hiểu thêm về cách sử dụng SDK quản trị trong các trường hợp SQL Connect sử dụng khác.

Thực hiện việc tải và cập nhật dữ liệu sản xuất hàng loạt

API để quản lý dữ liệu hàng loạt sẽ tạo các đột biến GraphQL thay cho bạn, thay vì yêu cầu bạn tạo các chuỗi mutation {...} bằng API executeGraphQL được mô tả trước đó để thêm một vài hàng ở đây và ở đó theo cách cục bộ.

Một lợi ích chính của API quản trị là khả năng quản lý và sử dụng lại các mảng dữ liệu riêng biệt cho các luồng CI/CD hoặc thiết lập các tệp dữ liệu hàng loạt lớn cho dữ liệu sản xuất.

Các đoạn mã sau đây minh hoạ cách thiết lập tập lệnh dữ liệu hàng loạt.

import { initializeApp } from 'firebase-admin/app';
import { getDataConnect } from 'firebase-admin/data-connect';

const app = initializeApp();

const dc = getDataConnect({ location: "us-west2", serviceId: "my-service" });

const 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",
    // Nested reviews can be inserted atomically along with the movie
    reviews_on_movie: [
      {
        rating: 5,
        reviewText: "Amazing concept!",
        user: { id: "user-123" } // Link to existing user
      }
    ]
  },
  {
    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",
    reviews_on_movie: [
      {
        rating: 5,
        reviewText: "A masterpiece of sci-fi action.",
        user: { id: "user-456" }
      }
    ]
  }
];

// Methods of the bulk operations API
const resp = await dc.insert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.insertMany("movie" /*table name*/, data);

// Or
const resp = await dc.upsert("movie" /*table name*/, data[0]);
// Or
const resp = await dc.upsertMany("movie" /*table name*/, data);

Phát triển sản xuất: sử dụng SQL để cập nhật dữ liệu hàng loạt

Khi bạn đang làm việc với một giản đồ ổn định trong quá trình sản xuất và không sửa đổi giản đồ, bạn có thể làm việc trong thực thể Cloud SQL để quản lý việc tải và cập nhật dữ liệu.

Hãy tham khảo Cloud SQL cho PostgreSQL để nhập dữ liệu.

Bước tiếp theo là gì?