Skip to main content

FraiseQL

Quality Gate Documentation Release Python License: MIT

A Python GraphQL framework for PostgreSQL. Declare types and operations with decorators, point them at PostgreSQL views and functions, and FraiseQL serves a typed GraphQL API over FastAPI — no build step, no code generation.

PostgreSQL returns JSONB. An integrated Rust pipeline (fraiseql_rs) transforms it into the HTTP response. You write Python; the hot path runs in Rust.

Requires: Python 3.13 or 3.14 · PostgreSQL 13+

import fraiseql
from fraiseql.fastapi import create_fraiseql_app

@fraiseql.type(sql_source="v_user", jsonb_column="data")
class User:
    """A user in the system.

    Fields:
        id: Unique user identifier
        name: User's full name
        email: User's email address
    """
    id: int
    name: str
    email: str

@fraiseql.query
async def users(info) -> list[User]:
    """Get all users."""
    db = info.context["db"]
    return await db.find("v_user")

app = create_fraiseql_app(
    database_url="postgresql://localhost/mydb",
    types=[User],
    queries=[users],
)

Attribute docstrings become GraphQL descriptions. List queries get where, orderBy, limit and offset wired in automatically.


How it works

Typical ORM stack:  PostgreSQL → rows → ORM objects → Python dicts → JSON → HTTP
FraiseQL:           PostgreSQL → JSONB → Rust field selection → HTTP

The view composes the whole response shape in one query, so there is no N+1 problem and no Python serialization in the hot path. On the transformation benchmark the JSON step runs 3.6–5.9x faster than the equivalent pure-Python path — 4.1x on a 7 KB nested payload, 4.0x on a 32 KB one.

It also makes the security model structural rather than defensive:

CREATE VIEW v_user AS
SELECT id, jsonb_build_object('id', id, 'email', email) AS data
FROM tb_user;
-- password_hash and api_key are not in the JSONB, so they cannot leak

With an ORM-backed schema, forgetting to exclude a column is a data leak. Here the view is the contract. Reads go through v_* views and tv_* projection tables; writes go through fn_* PostgreSQL functions (CQRS).


v1 vs v2 — which repo do you want?

This repository is v1 (fraiseql-python). There is a separate v2 project with a different architecture. Both are actively maintained.

v1 — this repo v2 — fraiseql/fraiseql
Status Stable (1.29.1) Active (2.16.0; breaking changes ship in minor releases)
Engine Python + Rust pipeline Compiled Rust engine
Schema authoring Python decorators 16+ languages
Databases PostgreSQL only PostgreSQL, MySQL, SQLite, SQL Server
Deployment Runtime (FastAPI, hot reload) Build-time (fraiseql-cli compile)

Pick v1 for a Python codebase already invested in PostgreSQL, with fast iteration and no build step. Pick v2 for polyglot teams, multiple databases, or compile-time guarantees.


Is this for you?

Good fit if you run PostgreSQL and are comfortable writing views and functions, want a database-first API, need multi-tenant isolation, care about JSON throughput, or lean on LLMs for code generation — SQL and Python are well-trained, and there is no proprietary DSL in the way.

Look elsewhere if you need a database other than PostgreSQL (that is v2), do not want JSONB in your schema, are building your first GraphQL API, or want an ORM to model your data for you.

See Choosing FraiseQL for a longer comparison.


Quick start

pip install "fraiseql<2"        # or: pip install "fraiseql[all]<2"
fraiseql init my-api
cd my-api
fraiseql dev

v1 and v2 share the fraiseql name on PyPI, and the bare name now resolves to v2 — hence the <2 pin. Your API is live at http://localhost:8000/graphql.


Features

  • GraphQL Cascade — mutations report what they changed and which queries to invalidate; clients request as much or as little of it as they want.
  • Mutations without boilerplate — @fraiseql.success auto-injects status, message, updated_fields and id; the SQL function holds the business logic.
  • Specialized scalars — 50+ validated types (EmailAddress, Money, IpAddress, LTree, CUSIP, DateRange, …) with type-aware SQL operators.
  • Advanced filtering — full-text search, JSONB paths, array operators, regex, ranges, and nested array filters with AND/OR/NOT.
  • Vector search — pgvector integration for semantic search and RAG, with 6 distance operators.
  • Trinity identifiers — pk_* integer keys for fast joins (never exposed), id UUIDs for a stable public API, identifier slugs for URLs.
  • Security — RLS, rate limiting, CSRF, security headers, field-level authorization, KMS backends (Vault/AWS/GCP), audit logging, and SBOM generation via fraiseql sbom generate. Enforcement maturity varies per feature: security profiles enforce 7 of their 14 settings, and query depth, query complexity, introspection policy and audit level are configured but not enforced by the profile (see the module docstring in src/fraiseql/security/profiles/definitions.py). Check a given control before relying on it in production.
  • Everything in PostgreSQL — caching (UNLOGGED tables), error tracking and OpenTelemetry traces live in the same database, so a small deployment needs no Redis, Sentry or APM service.
  • Automatic Persisted Queries — memory or PostgreSQL-backed storage for multi-instance coordination.
  • Resilience testing — a separate, informational workflow runs the 71 failure-injection tests marked chaos_real_db (of 145 in tests/chaos/) against real PostgreSQL, apart from the per-PR suite (strategy).

Docs and tooling

The fraiseql CLI covers init, dev, check, doctor, generate, sql, migrate, turbo, sbom and query-stats. Run fraiseql --help or see the CLI reference. migrate needs the migrate extra: pip install "fraiseql[migrate]<2".


Contributing

git clone https://github.com/fraiseql/fraiseql-python
cd fraiseql-python
uv sync                     # runtime + dev deps, builds the Rust extension
uv run pre-commit install

Requires a Rust toolchain for fraiseql_rs. The runtime floor is PostgreSQL 13; the integration tests want 14+, and CI runs them on 16. See the Contributing Guide.


About

FraiseQL is created by Lionel Hamayon (@evoludigit). The idea: let PostgreSQL return the JSON, let Rust shape it, and keep Python out of the hot path.

MIT licensed — see LICENSE.

Metadata

Release files for fraiseql 1.29.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fraiseql 1.29.1
File Size Uploaded Provenance
fraiseql-1.29.1.tar.gz 867.8 kB Without provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for fraiseql 1.29.1
File
fraiseql-1.29.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
fraiseql-1.29.1-cp314-cp314-manylinux_2_38_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.38+ x86-64 Details
fraiseql-1.29.1-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
fraiseql-1.29.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
fraiseql-1.29.1-cp313-cp313-manylinux_2_38_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.38+ x86-64 Details
fraiseql-1.29.1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details

Total release size: 21.9 MB

Release files / fraiseql-1.29.1.tar.gz

Download URL fraiseql-1.29.1.tar.gz
Size 867.8 kB
Tags Source
SHA-256 checksum
How to use checksums
b9109398d600979936534428e78d51bb9440ad20210263559e37df03814afb31
BLAKE2b-256 checksum
How to use checksums
5903858892063b403d23a67598c10b8278aba1b339a2f3e8e452d5f5c2793052
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / fraiseql-1.29.1-cp314-cp314-win_amd64.whl

Download URL fraiseql-1.29.1-cp314-cp314-win_amd64.whl
Size 3.3 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
6de548fc3e428882d753298d177a12b069f45474b20fbb621770e6b41ae22cdd
BLAKE2b-256 checksum
How to use checksums
0173d4e58af6e723b2ec8d28f208b7592b10eed2619f34abd8d5023dc9674520
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / fraiseql-1.29.1-cp314-cp314-manylinux_2_38_x86_64.whl

Download URL fraiseql-1.29.1-cp314-cp314-manylinux_2_38_x86_64.whl
Size 3.7 MB
Tags CPython 3.14 Linux glibc 2.38+ x86-64
SHA-256 checksum
How to use checksums
bb31aa121721d5205a3eef98db2d99f1f2ba5865eae093a20ca7db9dedef24df
BLAKE2b-256 checksum
How to use checksums
e53ec6a250f8ace9c9781d9b7ef6e211450e58da8a53a2748e62151d921c799e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / fraiseql-1.29.1-cp314-cp314-macosx_11_0_arm64.whl

Download URL fraiseql-1.29.1-cp314-cp314-macosx_11_0_arm64.whl
Size 3.4 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5eb90f8ec1462ca0f28844c9d9e396abd6f710b88d9369e2c8e31838af803fe2
BLAKE2b-256 checksum
How to use checksums
c7778d9d27c78ab6db913a1dec8eb108ce6d6598f32d4049f0e618f2c09397f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / fraiseql-1.29.1-cp313-cp313-win_amd64.whl

Download URL fraiseql-1.29.1-cp313-cp313-win_amd64.whl
Size 3.3 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
3e536e7c9287c572b2a7a38ba9507cbb2d777e6c45eb0c279d3090bf2ae7519e
BLAKE2b-256 checksum
How to use checksums
e606e9589946d82fea8108aabc60dd7c619dd69b27b9b70eab21134f7da71e06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / fraiseql-1.29.1-cp313-cp313-manylinux_2_38_x86_64.whl

Download URL fraiseql-1.29.1-cp313-cp313-manylinux_2_38_x86_64.whl
Size 3.7 MB
Tags CPython 3.13 Linux glibc 2.38+ x86-64
SHA-256 checksum
How to use checksums
52289575543f7c599a7291ff94a2f2104485939caadc514386fcedd5c636f707
BLAKE2b-256 checksum
How to use checksums
467e00738087e5a2611ab46b76e68f910dbf9174f0d0b72c15a7b88aa40ed279
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / fraiseql-1.29.1-cp313-cp313-macosx_11_0_arm64.whl

Download URL fraiseql-1.29.1-cp313-cp313-macosx_11_0_arm64.whl
Size 3.4 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
434ad69915c9c3399f654ca4843805ecd516f74d8947639204fa67ffa2489102
BLAKE2b-256 checksum
How to use checksums
5b3b5db1eef3695315c52d66e242b40af7f9a72c95799edd38db19aebd0673f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Security for fraiseql 1.29.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

1.29.1 This release

7 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page