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.30.0) 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.30.0

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.30.0
File Size Uploaded Provenance
fraiseql-1.30.0.tar.gz 860.0 kB Without provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for fraiseql 1.30.0
File
fraiseql-1.30.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
fraiseql-1.30.0-cp314-cp314-manylinux_2_38_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.38+ x86-64 Details
fraiseql-1.30.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
fraiseql-1.30.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
fraiseql-1.30.0-cp313-cp313-manylinux_2_38_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.38+ x86-64 Details
fraiseql-1.30.0-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.30.0.tar.gz

Download URL fraiseql-1.30.0.tar.gz
Size 860.0 kB
Tags Source
SHA-256 checksum
How to use checksums
604d814dbaac3b4d21908aecd34c0e3361eac45c5c796b0d235c39c85ad5193c
BLAKE2b-256 checksum
How to use checksums
57a6cef691ef4643ab209d3b5006a387824e2320e599631ffe8f1ec914bb270a
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.30.0-cp314-cp314-win_amd64.whl

Download URL fraiseql-1.30.0-cp314-cp314-win_amd64.whl
Size 3.3 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
4ecfb4a7351591981f469743f78d7e7e1cf64912a0e0c57e4c70edb5164acc2b
BLAKE2b-256 checksum
How to use checksums
7b8c5c58d2fa38c3c91692d95151fa5c9ffa9c26224d751a5e7bd7e6fb83da94
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.30.0-cp314-cp314-manylinux_2_38_x86_64.whl

Download URL fraiseql-1.30.0-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
714f045cd9ae0b70cc68b840561ff23f59d4ce6877cf7838a6d720b276e898c2
BLAKE2b-256 checksum
How to use checksums
823d6ecde88175f449f26eabac6f4d83e646516d4e875fb67697f11541087dd1
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.30.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL fraiseql-1.30.0-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
63f2d564d5a532b8d5a1683a32c7af7ffc54c069c118a4dd9eef4c860c387215
BLAKE2b-256 checksum
How to use checksums
46bb578f7f91ab8dda60c786e55ba1e9bf83a3866c45d3b115c48fb0710c9957
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.30.0-cp313-cp313-win_amd64.whl

Download URL fraiseql-1.30.0-cp313-cp313-win_amd64.whl
Size 3.3 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
e335395b64afe0a5311263fdcd356048ee2620b4ae6a137616186751984f6bdc
BLAKE2b-256 checksum
How to use checksums
00922ef4687d933416ab71b6d25a53de1258db9511202814f24d0b26c637f6ba
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.30.0-cp313-cp313-manylinux_2_38_x86_64.whl

Download URL fraiseql-1.30.0-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
7745e2324436126aa5d8f1d411f02d82cc600ca7e4fedd9a338c160ed5f5458b
BLAKE2b-256 checksum
How to use checksums
28d0a68cd1af9acbdaa31a9137cda999b702e4fa74f2dd4ee270576ce45aee3d
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.30.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL fraiseql-1.30.0-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
237b2babc17b56070673f4cfe8a6ab52f3bb449f25278fd7138d604c3927b42d
BLAKE2b-256 checksum
How to use checksums
f58930fdaf1446e1b31f4ab26ff526017dd42b202ff0b3057fb8ea3f33918f97
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.30.0

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.30.0 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