https://github.com/f0rr0/oliphaunt
Embedded Postgres inside your apps and tests. No Docker, Node.js, or server. As easy as SQLite.
https://github.com/f0rr0/oliphaunt
pglite postgres rust wasm
Last synced: 14 days ago
JSON representation
Embedded Postgres inside your apps and tests. No Docker, Node.js, or server. As easy as SQLite.
- Host: GitHub
- URL: https://github.com/f0rr0/oliphaunt
- Owner: f0rr0
- License: mit
- Created: 2025-09-27T01:50:23.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2026-06-12T00:18:53.000Z (19 days ago)
- Last Synced: 2026-06-12T01:19:20.331Z (19 days ago)
- Topics: pglite, postgres, rust, wasm
- Language: Rust
- Homepage:
- Size: 22.9 MB
- Stars: 76
- Watchers: 0
- Forks: 7
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
pglite-oxide
Embedded Postgres for Rust tests and local apps.
Real PostgreSQL. Instant testing. Packaged runtime. Direct Rust API or a local Postgres URL.
Usage
·
Performance
·
Extensions
·
Dump & Upgrade
·
Testing
·
Tauri
`pglite-oxide` brings PGlite/Postgres to Rust with a small API. Open a database
directly with `Pglite`, or hand `PgliteServer` to SQLx and any standard
Postgres client. The packaged runtime is PostgreSQL 17.5. No local Postgres
install, no Docker, no runtime build toolchain.
## Add Postgres In One Minute ⚡
Already using SQLx or another Postgres client? Add the crate and point your
client at an embedded database URL:
```sh
cargo add pglite-oxide
```
```rust,no_run
use pglite_oxide::PgliteServer;
use sqlx::{Connection, Row};
#[tokio::main]
async fn main() -> Result<(), Box> {
let server = PgliteServer::temporary_tcp()?;
// For a persistent TCP server:
// let server = PgliteServer::builder().path("./.pglite").start()?;
let mut conn = sqlx::PgConnection::connect(&server.database_url()).await?;
let row = sqlx::query("SELECT $1::int4 + 1 AS answer")
.bind(41_i32)
.fetch_one(&mut conn)
.await?;
assert_eq!(row.try_get::("answer")?, 42);
conn.close().await?;
server.shutdown()?;
Ok(())
}
```
That's it. Real PostgreSQL, no service setup.
## Why pglite-oxide ✨
Postgres should be as easy to add to a Rust project as SQLite.
- ⚡ **No service tax**: no Docker, no local Postgres, no testcontainers.
- 🔌 **Use your real stack**: SQLx, `tokio-postgres`, CLIs, and other clients
connect through a normal local URL.
- 🌉 **Proxy included**: expose an embedded database to non-Rust tools with
`pglite-proxy`.
- 🧪 **Clean tests**: temporary databases are isolated, fast, and removed on
drop.
- 💾 **Persistent apps**: keep local app data across restarts when you want it.
- 🧩 **Extensions included**: `pgvector`, `pg_trgm`, `hstore`, `citext`, and
more.
- 📦 **Portable dumps**: use bundled `pg_dump` for logical backups and upgrade
paths.
- 🚀 **Near-native feel**: close to native Postgres, fully embedded.
## Near-Native Performance 🚀
Current local snapshot on `Apple M1 Pro`, `16 GB RAM`, and `macOS 26.4.1`.
Full numbers and reproduction steps live in the
[performance guide](https://github.com/f0rr0/pglite-oxide/blob/main/docs/PERFORMANCE.md). Lower is better.
| Operation | native pg + SQLx | pglite-oxide + SQLx | vanilla PGlite + SQLx |
|---|---:|---:|---:|
| 25,000 INSERTs in one transaction | 132.36 ms | 149.54 ms | 257.02 ms |
| 25,000 INSERTs in one statement | 46.14 ms | 59.39 ms | 117.19 ms |
| 25,000 INSERTs into an indexed table | 188.72 ms | 253.38 ms | 352.64 ms |
| 5,000 indexed SELECTs | 81.39 ms | 125.31 ms | 203.05 ms |
| 25,000 indexed UPDATEs | 351.05 ms | 578.96 ms | 720.63 ms |
`pglite-oxide` stays close to native Postgres while running entirely embedded
and consistently performs better than vanilla PGlite.
## Extensions 🧩
Bundled extensions are supported, including `pgvector`, `pg_trgm`, `hstore`,
`citext`, `ltree`, and more. See the
[extensions guide](https://github.com/f0rr0/pglite-oxide/blob/main/docs/EXTENSIONS.md)
for the full catalog and usage details.
```rust,no_run
use pglite_oxide::{extensions, PgliteServer};
use sqlx::Connection;
#[tokio::main]
async fn main() -> Result<(), Box> {
let server = PgliteServer::builder()
.path("./.pglite")
.extension(extensions::VECTOR)
.start()?;
let mut conn = sqlx::PgConnection::connect(&server.database_url()).await?;
sqlx::query("CREATE TABLE IF NOT EXISTS items (embedding vector(3))")
.execute(&mut conn)
.await?;
sqlx::query("INSERT INTO items VALUES ('[1,2,3]')")
.execute(&mut conn)
.await?;
conn.close().await?;
server.shutdown()?;
Ok(())
}
```
## Docs
- [Usage guide](https://github.com/f0rr0/pglite-oxide/blob/main/docs/USAGE.md)
- [Extensions](https://github.com/f0rr0/pglite-oxide/blob/main/docs/EXTENSIONS.md)
- [Performance guide](https://github.com/f0rr0/pglite-oxide/blob/main/docs/PERFORMANCE.md)
- [Dump and upgrade guide](https://github.com/f0rr0/pglite-oxide/blob/main/docs/PG_DUMP.md)
- [Testing guide](https://github.com/f0rr0/pglite-oxide/blob/main/docs/TESTING.md)
- [Tauri usage](https://github.com/f0rr0/pglite-oxide/blob/main/docs/TAURI.md)
- [Runtime guide](https://github.com/f0rr0/pglite-oxide/blob/main/docs/RUNTIME.md)