PostgREST implementation for the Supabase Potion SDK in Elixir.
The Supabase.PostgREST
module provides a suite of functions to interact with a Supabase PostgREST API using a fluent interface. This allows you to construct and execute complex queries in the context of a Supabase database application, facilitating a more functional approach to managing database operations in Elixir.
Please, refers to the official Supabase PostgREST documentation to have the context on how to apply query and filters on your data, and also configure your project to expose the PostgREST API.
Add the following dependencies to your mix.exs
file:
def deps do
[
{:supabase_potion, "~> 0.5"},
{:supabase_postgrest, "~> 0.1"}
]
end
Then, run mix deps.get
to fetch the dependencies.
Before using the Supabase.PostgREST
module, you need to initialize a Supabase client. This client handles the authentication and configuration needed to interact with the Supabase services.
You can initialize the client as can be found on the Supabase Potion documentation
This client struct is passed to the various Supabase.PostgREST
functions to perform operations on your Supabase database.
Here’s how you can perform common operations using the Supabase.PostgREST
module.
Note that all operations and filters on Supabase.PostgREST
are lazy, that means that queries, insertions, deletions and updates are only executed when you explicit call Supabase.PostgREST.execute/1
.
To select records from a table, use the from/2
and select/3
functions:
iex> alias Supabase.PostgREST, as: Q
iex> Q.from(client, "users") |> Q.select("*", returning: true) |> Q.execute()
iex> {:ok, result} | {:error, %Supabase.PostgREST.Error{}}
You can specify the columns to retrieve instead of using *
:
iex> Q.select(query, ["id", "name"], returning: true)
To insert new records, use the insert/3
function:
iex> alias Supabase.PostgREST, as: Q
iex> Q.from(client, "users") |> Q.insert(%{name: "John Doe", age: 30}, returning: :representation) |> Q.execute()
iex> {:ok, result} | {:error, %Supabase.PostgREST.Error{}}
To update existing records, use the update/3
function:
iex> alias Supabase.PostgREST, as: Q
iex> Q.from(client, "users") |> Q.eq("id", 1) |> Q.update(%{name: "John Smith"}, returning: :representation) |> Q.execute()
iex> {:ok, result} | {:error, %Supabase.PostgREST.Error{}}
To delete records, use the delete/2
function:
iex> alias Supabase.PostgREST, as: Q
iex> Q.from(client, "users") |> Q.eq("id", 1) |> Q.delete(query, returning: :representation) |> Q.execute()
iex> {:ok, result} | {:error, %Supabase.PostgREST.Error{}}
You can apply various filters to your queries using functions like eq/3
, lt/3
, gt/3
, etc.
iex> alias Supabase.PostgREST, as: Q
iex> Q.from(client, "users") |> Q.eq("status", "active") |> Q.select("*", returning: true) |> Q.execute()
iex> {:ok, result} | {:error, %Supabase.PostgREST.Error{}}
You can also perform more advanced operations like full-text search, ordering, limiting, and combining filters using logical operators:
iex> alias Supabase.PostgREST, as: Q
iex> Q.from(client, "users")
|> Q.text_search("name", "John", type: :plain)
|> Q.order("created_at", asc: true)
|> Q.select(["id", "name", "created_at"], returning: true)
|> Q.execute()
iex> {:ok, result} | {:error, %Supabase.PostgREST.Error{}}
After constructing a query, you can execute it using the execute/1
or execute_to/2
functions. The execute_to/2
function allows you to map the results directly to a specific schema:
iex> defmodule User, do: defstruct([:id])
iex> alias Supabase.PostgREST, as: Q
iex> Q.from(client, "users")
|> Q.eq("id", 1)
|> Q.select(["id"], returning: true)
|> Q.execute_to(User)
iex> {:ok, %User{} = user} | {:error, %Supabase.PostgREST.Error{}}
If you find any issues or have suggestions for improvements, please feel free to open an issue or a pull request on the GitHub repository.
This project is licensed under the MIT License.
This README provides a clear and structured guide for users of your package, with accurate examples and explanations of how to use the various functions provided by the Supabase.PostgREST
module.