Firebase 是一个围绕非关系型技术构建的应用开发平台。Firebase 封装器支持连接到以下对象。

  1. 认证用户 (只读)
  2. Firestore 数据库文档 (只读)

准备

在开始之前,请确保您的数据库上安装了wrappers 扩展:

  create extension if not exists wrappers with schema extensions;
  

然后创建外部数据封装器:

  create foreign data wrapper firebase_wrapper
  handler firebase_fdw_handler
  validator firebase_fdw_validator;
  

安全保护您的凭证(可选)

默认情况下,Postgres 将 FDW 凭证以明文形式存储在 pg_catalog.pg_foreign_server 中。任何有权访问此表的人都能够查看这些凭证。封装器设计为与 Vault 配合使用,Vault 为存储凭证提供了额外的安全级别。我们建议您使用 Vault 存储您的凭证。

  -- Save your Firebase credentials in Vault and retrieve the `key_id`
insert into vault.secrets (name, secret)
values (
  'firebase',
  '{
      "type": "service_account",
      "project_id": "your_gcp_project_id",
      ...
  }'
)
returning key_id;
  

连接到 Firebase

我们需要为 Postgres 提供连接到 Firebase 的凭证和任何额外的选项。我们可以使用 create server 命令来完成这个操作:

使用Vault

      create server firebase_server
      foreign data wrapper firebase_wrapper
      options (
        sa_key_id '<key_ID>', -- The Key ID from above.
        project_id '<firebase_project_id>'
    );
  

不使用Vault

      create server firebase_server
      foreign data wrapper firebase_wrapper
       options (
         sa_key '
         {
            "type": "service_account",
            "project_id": "your_gcp_project_id",
            ...
         }
        ',
         project_id 'firebase_project_id'
       );
  

创建外部表

Firebase 封装器支持从以下 Firebase 对象读取数据:

Firebase Select Insert Update Delete Truncate
认证用户
Firestore 数据库文档

例如:

  create foreign table firebase_users (
  uid text,
  email text,
  created_at timestamp,
  attrs jsonb
)
  server firebase_server
  options (
    object 'auth/users'
  );
  

注意,外部表中有一个元数据列 attrs,它包含了从 Firebase 返回的所有数据,格式为 json。

外部表选项

完整的外部表选项如下:

  • object - Firebase 中的对象名称,必需.

    对于认证用户,对象名称固定为 auth/users. 对于 Firestore 文档,其格式为 firestore/<collection_id>, 注意集合 ID 必须是完整路径 ID。例如,

    • firestore/my-collection
    • firestore/my-collection/my-document/another-collection

查询下推支持

这个 FDW 不支持查询下推。

示例

一些关于如何使用 Firebase 外部表的示例。

firestore

要映射 Firestore 集合,请使用格式firestore/<collection_id> 作为 object 选项,如下所示。

  create foreign table firebase_docs (
  name text,
  created_at timestamp,
  updated_at timestamp,
  attrs jsonb
)
  server firebase_server
  options (
    object 'firestore/user-profiles'
  );
  

注意, name, created_atupdated_at是所有 Firestore 集合上的自动元数据字段。

auth/users

auth/users 集合是一个具有唯一元数据的特殊案例。以下展示了如何将 Firebase 用户映射到 PostgreSQL 表。

  create foreign table firebase_users (
  uid text,
  email text,
  created_at timestamp,
  attrs jsonb
)
  server firebase_server
  options (
    object 'auth/users'
  );