Supabase Wrappers is a development framework for Postgres Foreign Data Wrappers (FDW), written in Rust. Its goal is to make Postgres FDW development easier while keeping Rust language's modern capabilities, such as high performance, strong types, and safety.
Supabase Wrappers is a pgx extension, so you can follow the installation steps as mentioned by pgx.
To develop a FDW using Supabase Wrappers, you only need to implement the ForeignDataWrapper trait.
```rust pub trait ForeignDataWrapper { // function for query planning fn getrelsize(...) -> (i64, i32)
// functions for data scan, e.g. select
fn begin_scan(...);
fn iter_scan(...) -> Option<Row>;
fn re_scan(...);
fn end_scan(...);
// functions for data modify, e.g. insert, update and delete
fn begin_modify(...);
fn insert(...);
fn update(...);
fn delete(...);
fn end_modify(...);
} ```
In a minimum FDW, which supports data scan only, begin_scan()
, iter_scan()
and end_scan()
are required, all the other functions are optional.
We support the following FDWs, with more under development:
HelloWorld
: /src/fdw/helloworld_fdw
. A demo FDW to show how to develop a baisc FDW./src/fdw/bigquery_fdw
. A FDW for BigQuery which supports async data scan only at this moment. /src/fdw/clickhouse_fdw
. A FDW for ClickHouse which supports both async data scan and modify. /src/fdw/stripe_fdw
. A FDW for Stripe API.These steps outline how to use the a demo FDW HelloWorldFdw:
bash
git clone https://github.com/supabase/wrappers.git
bash
cd wrappers/wrappers
cargo pgx run --features helloworld_fdw
```sql -- create extension drop extension if exists wrappers cascade; create extension wrappers;
-- create foreign data wrapper and enable 'HelloWorldFdw' drop foreign data wrapper if exists wrappershelloworld cascade; create foreign data wrapper wrappershelloworld handler wrappershandler validator wrappersvalidator options ( wrapper 'HelloWorldFdw' );
-- create server and specify custom options drop server if exists myhelloworldserver cascade; create server myhelloworldserver foreign data wrapper wrappers_helloworld options ( foo 'bar' );
-- create an example foreign table drop foreign table if exists balance; create foreign table hello ( id bigint, col text ) server myhelloworldserver options ( foo 'bar' ); ```
sql
wrappers=# select * from hello;
id | col
----+-------------
0 | Hello world
(1 row)
pgx
.All contributions, feature requests, bug report or ideas are welcomed.