Начало работы с Firebase SQL Connect

Это краткое руководство поможет вам начать работу с Firebase SQL Connect, чтобы подключить веб- и мобильные приложения к базе данных PostgreSQL. Вы сможете:

  • Настройте локальный каталог проекта Firebase SQL Connect с помощью VS Code и интерфейса командной строки Firebase.
  • Генерируйте схемы, запросы и мутации SQL Connect на основе идей для приложений, описанных обычным языком.
  • Используйте SDK со строгой типизацией в своих приложениях, чтобы выполнять запросы и мутации SQL Connect.
  • Создайте экземпляр Cloud SQL для PostgreSQL, схему SQL Connect, запросы и мутации.

Настройте локальный каталог проекта

Установить локальные инструменты разработки для SQL Connect можно двумя способами.

  1. В каталоге проекта выполните следующую команду:

    Скрипт установит интерфейс командной строки Firebase и расширение SQL Connect VS Code, а также поможет вам firebase init dataconnect, чтобы настроить проект. Если у вас не установлено приложение VS Code, скрипт откроет его в браузере.

    curl -sL https://firebase.tools/init/dataconnect | editor=true bash
  2. Откройте экран расширения SQL Connect VS Code, нажав на значок Firebase на левой панели Visual Studio Code.

  3. Нажмите Start emulators (Запустить эмуляторы), чтобы запустить эмулятор с локальной базой данных PGlite.

Проверить схему

Firebase SQL Connect использует GraphQL для определения модели данных. Директива @table сопоставляет тип GraphQL с таблицей PostgreSQL. Поля в типе сопоставляются со столбцами PostgreSQL. Вы можете определять связи между таблицами, используя поля, которые ссылаются на другие типы @table, в том числе связи "многие ко многим", используя таблицы соединений с составными первичными ключами.

В стандартной конфигурации файлы схемы SQL Connect находятся в каталоге dataconnect/schema/. Вот две таблицы из схемы шаблона фильма. Если вы использовали Gemini для создания схемы, она может отличаться.

type Movie @table {
  # Every table has an implicit primary key field that looks something like:
  #  id: UUID! @default(expr: "uuidV4()")
  title: String!
  imageUrl: String!
  genre: String
}

type Review @table(key: ["movie", "user"]) {
  user: User!
  movie: Movie!
  rating: Int
  reviewText: String
  reviewDate: Date! @default(expr: "request.time")
}

Подробнее о схемах SQL Connect…

Как создавать запросы и мутации

Firebase SQL Connect использует GraphQL для запросов и изменений. Вы определяете их в файлах .gql и вызываете по имени из своего приложения. Синтаксис GraphQL предоставляет строго типизированные SDK и гибкий API для получения именно тех данных, которые нужны вашему приложению.

Заполнить базу данных начальными данными

После запуска эмулятора вы можете заполнить его начальными данными. Вы можете использовать предоставленный файл dataconnect/seed_data.gql или написать собственные мутации.

Нажмите кнопку Run (local) (Выполнить локально) в VS Code, чтобы выполнить изменения и заполнить локальную базу данных PGlite.

Кнопка CodeLens Run для Firebase SQL Connect

Просмотр запросов и изменений

В настройках по умолчанию запросы и мутации SQL Connect находятся в каталоге dataconnect/example/.

Вы можете точно запрашивать реляционные данные с помощью вложенных запросов.

query ListMovies @auth(level: PUBLIC, insecureReason: "Anyone can list all movies and their reviews.") {
  movies {
    title imageUrl genre
    reviews_on_movie {
      rating reviewDate
      user { username }
    }
  }
}

SQL Connect помогает создавать безопасные запросы и мутации с помощью Firebase Auth.

Чтобы обеспечить безопасность приложения, веб- и мобильные приложения могут получать доступ только к запросам и изменениям SQL Connect с директивами @auth. Запросы и мутации могут безопасно получать доступ к UID Firebase Auth с помощью выражения {field}_expr: "auth.uid".

mutation AddReview($movieId: UUID!, $rating: Int!, $reviewText: String!) @auth(level: USER) {
  review_upsert(
    data: {
      userId_expr: "auth.uid"
      movieId: $movieId
      rating: $rating
      reviewText: $reviewText
    }
  )
}

Подробнее о запросах SQL Connect, мутациях SQL Connect и аутентификации SQL Connect…

Генерирование запросов и изменений

Чтобы эффективно использовать SQL Connect, не нужно быть экспертом по GraphQL. Вы можете генерировать запросы и мутации SQL Connect на основе описаний на естественном языке.

В любом файле .gql введите #, чтобы начать комментарий и описать запрос или мутацию. Затем нажмите кнопку Generate/Refine Operation (Создать/уточнить операцию), чтобы создать операцию GraphQL.

Кнопка CodeLens Generate для Firebase SQL Connect

Как использовать сгенерированный SDK в приложении

firebase init dataconnect автоматически настраивает типобезопасные SDK для приложений в вашем проекте. При необходимости вы можете добавить SDK вручную с помощью кнопки Add SDK to app (Добавить SDK в приложение) в расширении SQL Connect для VS Code или выполнив команду firebase init dataconnect:sdk.

Веб-приложение

  1. Добавьте Firebase в свое веб-приложение.
  2. В основном файле приложения React:

    • Импортируйте сгенерированный SDK:
    // Update as needed with the path to your generated SDK.
    import { listMovies, ListMoviesData } from '@dataconnect/generated';
    
    • Настройте приложение для подключения к эмулятору SQL Connect:
    import { connectDataConnectEmulator } from 'firebase/data-connect';
    
    const dataConnect = getDataConnect(connectorConfig);
    connectDataConnectEmulator(dataConnect, 'localhost', 9399);
    
    • Вызовите методы SQL Connect.
    function App() {
      const [movies, setMovies] = useState<ListMoviesData['movies']>([]);
      useEffect(() => {
        listMovies.then(res => setMovies(res.data));
      }, []);
      return (
        movies.map(movie => <h1>{movie.title}</h1>);
      );
    }
    
    const root = ReactDOM.createRoot(document.getElementById('root'));
    root.render(<App />);
    

Swift

  1. Добавьте Firebase в приложение для iOS.
  2. Чтобы использовать сгенерированный SDK, настройте его как зависимость в Xcode.

    На верхней панели навигации Xcode выберите File (Файл) > Add Package Dependencies (Добавить зависимости пакетов) > Add Local (Добавить локальный) и укажите папку, в которой находится сгенерированный файл Package.swift.

  3. В основном делегате приложения:

    • Импортируйте SDK SQL Connect и сгенерированный SDK:

      import FirebaseDataConnect
      // Generated queries.
      // Update as needed with the package name of your generated SDK.
      import <CONNECTOR-PACKAGE-NAME>
      
      let connector = DataConnect.moviesConnector
      
    • Настройте приложение для подключения к эмулятору SQL Connect:

      // Connect to the emulator on "127.0.0.1:9399"
      connector.useEmulator()
      
      // (alternatively) if you're running your emulator on non-default port:
      // connector.useEmulator(port: 9999)
      
    • Вызовите методы SQL Connect:

      struct ListMovieView: View {
          @StateObject private var queryRef = connector.listMovies.ref()
      
          var body: some View {
              VStack {
                  Button {
                      Task {
                          do {
                              try await refresh()
                          } catch {
                              print("Failed to refresh: \(error)")
                          }
                      }
                  } label: {
                      Text("Refresh")
                  }
      
                  // use the query results in a view
                  ForEach(queryRef.data?.movies ?? []) { movie in
                      Text(movie.title)
                  }
                  
              }
          }
      }
      
      @MainActor
      func refresh() async throws {
          _ = try await queryRef.execute()
      }
      
      struct ContentView_Previews: PreviewProvider {
          static var previews: some View {
              ListMovieView()
          }
      }
      

Kotlin Android

  1. Добавьте Firebase в приложение для Android.
  2. Чтобы использовать сгенерированный SDK, настройте SQL Connect как зависимость в Gradle.

    Обновите данные (plugins, dependencies) в сервисе app/build.gradle.kts.

    plugins {
      // Use whichever versions of these dependencies suit your application.
      // The versions shown here were the latest as of March 14, 2025.
      // Note, however, that the version of kotlin("plugin.serialization") must,
      // in general, match the version of kotlin("android").
      id("com.android.application") version "8.9.0"
      id("com.google.gms.google-services") version "4.4.2"
      val kotlinVersion = "2.1.10"
      kotlin("android") version kotlinVersion
      kotlin("plugin.serialization") version kotlinVersion
    }
    
    dependencies {
      // Use whichever versions of these dependencies suit your application.
      // The versions shown here were the latest versions as of March 14, 2025.
      implementation("com.google.firebase:firebase-dataconnect:16.0.0-beta04")
      implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1")
      implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3")
    
      // These dependencies are not strictly required, but will very likely be used
      // when writing modern Android applications.
      implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")
      implementation("androidx.appcompat:appcompat:1.7.0")
      implementation("androidx.activity:activity-ktx:1.10.1")
      implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
      implementation("com.google.android.material:material:1.12.0")
    }
    
  3. В основном действии приложения:

    • Получите экземпляр коннектора из сгенерированного SDK:
    private val connector = com.myapplication.MoviesConnector.instance
    
    • Настройте приложение для подключения к эмулятору SQL Connect:
    private val connector = com.myapplication.MoviesConnector.instance
      .apply {
        // Connect to the emulator on "10.0.2.2:9399" (default port)
        dataConnect.useEmulator()
    
        // (alternatively) if you're running your emulator on non-default port:
        // dataConnect.useEmulator(port = 9999)
      }
    
    • Вызовите методы SQL Connect.
    class MainActivity : AppCompatActivity() {
    
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val textView: TextView = findViewById(R.id.text_view)
    
        lifecycleScope.launch {
          lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
            
            val result = connector.listMovies.runCatching { execute { } }
            
            val newTextViewText = result.fold(
              onSuccess = {
                val titles = it.data.movies.map { it.title }
                "${titles.size} movies: " + titles.joinToString(", ")
              },
              onFailure = { "ERROR: ${it.message}" }
            )
            textView.text = newTextViewText
          }
        }
      }
    }
    

Flutter

  1. Добавьте Firebase в приложение Flutter.
  2. Установите flutterfire CLI dart pub global activate flutterfire_cli.
  3. Выполните команду flutterfire configure.
  4. В основной функции приложения:

    • Импортируйте сгенерированный SDK:
    // Generated queries.
    // Update as needed with the path to your generated SDK
    
    import 'movies_connector/movies.dart';
    
    • Настройте приложение для подключения к эмулятору SQL Connect:
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp(
        options: DefaultFirebaseOptions.currentPlatform,
      );
      
      MoviesConnector.instance.dataConnect
          .useDataConnectEmulator(Uri.base.host, 443, isSecure: true);
      
      runApp(const MyApp());
    }
    
    • Вызовите методы SQL Connect.
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            home: Scaffold(
                body: Column(children: [
          ConstrainedBox(
            constraints: const BoxConstraints(maxHeight: 200),
            child: FutureBuilder(
                future: MoviesConnector.instance.listMovies().execute(),
                builder: (context, snapshot) {
                  if (snapshot.connectionState == ConnectionState.done) {
                    return ListView.builder(
                      scrollDirection: Axis.vertical,
                      itemBuilder: (context, index) => Card(
                          child: Text(
                        snapshot.data!.data.movies[index].title,
                      )),
                      itemCount: snapshot.data!.data.movies.length,
                    );
                  }
                  return const CircularProgressIndicator();
                }),
          )
        ])));
      }
    }
    

Развертывание рабочей версии

Чтобы развернуть схему, запросы и изменения в рабочей версии, выполните следующие действия:

  1. Ознакомьтесь с информацией о ценах и бесплатном пробном периоде на странице Цены. Для вашего проекта может быть доступна одна из пробных версий Firebase SQL Connect.

  2. Нажмите кнопку Deploy to production (Развернуть в рабочей среде) в расширении SQL Connect VS Code или выполните в терминале следующую команду:

    firebase deploy --only dataconnect
    

    После развертывания вы можете просматривать схему, а также выполнять запросы и мутации в консоли Firebase (выберите Базы данных и хранилище > SQL Connect).

Подробнее о dataconnect.yaml… Подробнее о том, как SQL Connect работает с Cloud SQL…

Дальнейшие действия

Теперь, когда вы выполнили инструкции из руководства по быстрому началу работы, вы можете: