Firebase
Firebase is an app development platform built around non-relational technologies. The Firebase Wrapper supports connecting to below objects.
- Authentication Users (read only)
- Firestore Database Documents (read only)
Preparation
Before you can query Firebase, you need to enable the Wrappers extension and store your credentials in Postgres.
Enable Wrappers
Make sure the wrappers
extension is installed on your database:
_10create extension if not exists wrappers with schema extensions;
Enable the Firebase Wrapper
Enable the firebase_wrapper
FDW:
_10create foreign data wrapper firebase_wrapper_10 handler firebase_fdw_handler_10 validator firebase_fdw_validator;
Store your credentials (optional)
By default, Postgres stores FDW credentials inside pg_catalog.pg_foreign_server
in plain text. Anyone with access to this table will be able to view these credentials. Wrappers is designed to work with Vault, which provides an additional level of security for storing credentials. We recommend using Vault to store your credentials.
_11-- Save your Firebase credentials in Vault and retrieve the `key_id`_11insert into vault.secrets (name, secret)_11values (_11 'firebase',_11 '{_11 "type": "service_account",_11 "project_id": "your_gcp_project_id",_11 ..._11 }'_11)_11returning key_id;
Connecting to Firebase
We need to provide Postgres with the credentials to connect to Firebase, and any additional options. We can do this using the create server
command:
_10create server firebase_server_10 foreign data wrapper firebase_wrapper_10 options (_10 sa_key_id '<key_ID>', -- The Key ID from above._10 project_id '<firebase_project_id>'_10);
Create a schema
We recommend creating a schema to hold all the foreign tables:
_10create schema if not exists firebase;
Options
The full list of foreign table options are below:
-
object
- Object name in Firebase, required.For Authenciation users, the object name is fixed to
auth/users
. For Firestore documents, its format isfirestore/<collection_id>
, note that collection id must be a full path id. For example,firestore/my-collection
firestore/my-collection/my-document/another-collection
Entities
Authentication Users
This is an object representing Firebase Authentication Users.
Ref: Firebase Authentication Users
Operations
Object | Select | Insert | Update | Delete | Truncate |
---|---|---|---|---|---|
Authentication Users | ✅ | ❌ | ❌ | ❌ | ❌ |
Usage
_10create foreign table firebase.users (_10 uid text,_10 email text,_10 created_at timestamp,_10 attrs jsonb_10)_10 server firebase_server_10 options (_10 object 'auth/users'_10 );
Notes
- The
attrs
column contains all user attributes in JSON format - This is a special collection with unique metadata fields
Firestore Database Documents
This is an object representing Firestore Database Documents.
Ref: Firestore Database
Operations
Object | Select | Insert | Update | Delete | Truncate |
---|---|---|---|---|---|
Firestore Database Documents | ✅ | ❌ | ❌ | ❌ | ❌ |
Usage
_10create foreign table firebase.docs (_10 name text,_10 created_at timestamp,_10 updated_at timestamp,_10 attrs jsonb_10)_10 server firebase_server_10 options (_10 object 'firestore/user-profiles'_10 );
Notes
- The
name
,created_at
, andupdated_at
are automatic metadata fields on all Firestore collections - Collection ID must be a full path ID in the format
firestore/<collection_id>
- Examples of valid collection paths:
firestore/my-collection
firestore/my-collection/my-document/another-collection
- The
attrs
column contains all document attributes in JSON format
Query Pushdown Support
This FDW doesn't support query pushdown.
Limitations
This section describes important limitations and considerations when using this FDW:
- Only support read-only access to Authentication Users and Firestore Database Documents
- Default maximum row count limit is 10,000 records
- Full result sets are loaded into memory, which can impact PostgreSQL performance with large datasets
- Materialized views using these foreign tables may fail during logical backups
Examples
Some examples on how to use Firebase foreign tables.
firestore
To map a Firestore collection provide its location using the format firestore/<collection_id>
as the object
option as shown below.
_10create foreign table firebase.docs (_10 name text,_10 created_at timestamp,_10 updated_at timestamp,_10 attrs jsonb_10)_10 server firebase_server_10 options (_10 object 'firestore/user-profiles'_10 );
Note that name
, created_at
, and updated_at
, are automatic metadata fields on all Firestore collections.
auth/users
The auth/users
collection is a special case with unique metadata. The following shows how to map Firebase users to PostgreSQL table.
_10create foreign table firebase.users (_10 uid text,_10 email text,_10 created_at timestamp,_10 attrs jsonb_10)_10 server firebase_server_10 options (_10 object 'auth/users'_10 );