Skip to main content

FraiseQL v2 - Python Schema Authoring

Python decorators for authoring FraiseQL schemas

This package provides Python decorators to define GraphQL schemas that are compiled by the FraiseQL Rust engine.

Architecture

Python Decorators → schema.json → fraiseql-cli compile → schema.compiled.json → Rust Runtime

Important: This package is for schema authoring only. It does NOT provide runtime execution. The compiled schema is executed by the standalone Rust server.

Installation

pip install fraiseql

Quick Start

import fraiseql

# Define a GraphQL type
@fraiseql.type
class User:
    id: int
    name: str
    email: str
    created_at: str

# Define a query
@fraiseql.query(sql_source="v_user")
def users(limit: int = 10) -> list[User]:
    """Get all users with pagination."""
    pass

# Define a mutation
@fraiseql.mutation(sql_source="fn_create_user", operation="CREATE")
def create_user(name: str, email: str) -> User:
    """Create a new user."""
    pass

# Export schema to JSON
if __name__ == "__main__":
    fraiseql.export_schema("schema.json")

Compile Schema

# Compile schema.json to optimized schema.compiled.json
fraiseql-cli compile schema.json -o schema.compiled.json

# Start server with compiled schema
fraiseql-server --schema schema.compiled.json

Features

  • Type-safe: Python type hints map to GraphQL types
  • Database-backed: Queries map to SQL views, mutations to functions
  • Compile-time: All validation happens at compile time, zero runtime overhead
  • No FFI: Pure JSON output, no Python-Rust bindings needed
  • Analytics: Fact tables and aggregate queries for OLAP workloads

Analytics / Fact Tables

FraiseQL supports high-performance analytics via fact tables:

import fraiseql

# Define a fact table
@fraiseql.fact_table(
    table_name="tf_sales",
    measures=["revenue", "quantity", "cost"],
    dimension_paths=[
        {"name": "category", "json_path": "data->>'category'", "data_type": "text"},
        {"name": "region", "json_path": "data->>'region'", "data_type": "text"}
    ]
)
@fraiseql.type
class Sale:
    id: int
    revenue: float  # Measure (aggregatable)
    quantity: int   # Measure
    cost: float     # Measure
    customer_id: str  # Denormalized filter (indexed)
    occurred_at: str  # Denormalized filter (indexed)

# Define an aggregate query
@fraiseql.aggregate_query(
    fact_table="tf_sales",
    auto_group_by=True,
    auto_aggregates=True
)
@fraiseql.query
def sales_aggregate() -> list[dict]:
    """Aggregate sales with flexible grouping and filtering."""

This generates a GraphQL query that supports:

  • GROUP BY: Dimensions (category, region) and temporal buckets (occurred_at_day, occurred_at_month)
  • Aggregates: count, revenue_sum, revenue_avg, quantity_sum, etc.
  • WHERE: Pre-aggregation filters (customer_id, occurred_at range)
  • HAVING: Post-aggregation filters (revenue_sum_gt: 1000)
  • ORDER BY: Any aggregate or dimension
  • LIMIT/OFFSET: Pagination

Fact Table Pattern

-- Table name starts with tf_ (table fact)
CREATE TABLE tf_sales (
    id BIGSERIAL PRIMARY KEY,
    -- Measures: Numeric columns for fast aggregation
    revenue DECIMAL(10,2) NOT NULL,
    quantity INT NOT NULL,
    cost DECIMAL(10,2) NOT NULL,
    -- Dimensions: JSONB column for flexible GROUP BY
    data JSONB NOT NULL,
    -- Denormalized filters: Indexed columns for fast WHERE
    customer_id UUID NOT NULL,
    occurred_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX ON tf_sales(customer_id);
CREATE INDEX ON tf_sales(occurred_at);

Key Principles:

  • Measures: SQL columns (numeric types) for fast aggregation
  • Dimensions: JSONB data column for flexible grouping
  • Denormalized Filters: Indexed SQL columns for fast WHERE clauses
  • No Joins: All dimensional data denormalized at ETL time

Type Mapping

Python Type GraphQL Type
int Int
float Float
str String
bool Boolean
list[T] [T]
T | None T (nullable)
Custom class Object type

Documentation

Full documentation: https://fraiseql.readthedocs.io

License

MIT

Release files for fraiseql 2.14.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 2.14.1
File Size Uploaded
fraiseql-2.14.1.tar.gz 331.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fraiseql 2.14.1
File Interpreter ABI Platform
fraiseql-2.14.1-py3-none-any.whl Python 3 none any Details

Total release size: 389.9 kB

Release files / fraiseql-2.14.1.tar.gz

Download URL fraiseql-2.14.1.tar.gz
Size 331.5 kB
Tags Source
SHA-256 checksum
How to use checksums
97463e55c440055c5a4f4b40ed8ed5fb1d0129ec5df09fb076697ff3d67b0f69
BLAKE2b-256 checksum
How to use checksums
d3ade54b59a4304d4df0c6828a837ccfb91726a08c6ecd4353c6bcad5704e391
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release files / fraiseql-2.14.1-py3-none-any.whl

Download URL fraiseql-2.14.1-py3-none-any.whl
Size 58.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
24191fb1b2952bbe7558cda6fbbdf22d82b86e173859ac762721d4b5207407db
BLAKE2b-256 checksum
How to use checksums
1ed4ec343b439bf8bb293321eaae016acba4fef99d1d842d7f61acf1391bd3e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release history Release notifications | RSS feed

This release

2.14.1 This release

2 release files

2.14.0

2 release files

2.13.1

2 release files

2.13.0

2 release files

2.12.0

2 release files

2.10.0

2 release files

2.9.0

2 release files

2.8.0

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.6

2 release files

2.1.5

2 release files

2.1.4

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.26.0

4 release files

1.25.0

4 release files

1.24.0

4 release files

1.23.9

4 release files

1.23.8

4 release files

1.22.0

4 release files

1.21.0

4 release files

1.20.1

4 release files

1.20.0

4 release files

1.17.0

4 release files

1.16.5

4 release files

1.16.4

4 release files

1.16.3

4 release files

1.16.2

4 release files

1.16.1

4 release files

1.16.0

4 release files

1.15.0

4 release files

1.14.0

4 release files

1.13.0

4 release files

1.12.0

2 release files

1.11.0

2 release files

1.10.1

2 release files

1.10.0

2 release files

1.9.20

2 release files

1.9.19

2 release files

1.9.18

2 release files

1.9.16

4 release files

1.9.15

4 release files

1.9.13

4 release files

1.9.11

4 release files

1.9.10

4 release files

1.9.9

4 release files

1.9.8

4 release files

1.9.7

4 release files

1.9.6

4 release files

1.9.5

4 release files

1.9.4

4 release files

1.9.3

4 release files

1.9.2

4 release files

1.9.1

4 release files

1.9.0

6 release files

1.8.9

6 release files

1.8.8

6 release files

1.8.7

6 release files

1.8.5

6 release files

1.8.4

6 release files

1.8.3

6 release files

1.8.2

6 release files

1.8.1

6 release files

1.8.0

6 release files

1.7.1

6 release files

1.7.0

6 release files

1.6.0

6 release files

1.5.0

6 release files

1.4.0

6 release files

1.3.4

6 release files

1.3.3

6 release files

1.3.2

6 release files

1.3.1

1 release file

1.3.0

6 release files

1.2.2

6 release files

1.2.1

6 release files

1.2.0

6 release files

1.1.7

6 release files

1.1.6

6 release files

1.1.5

6 release files

1.1.4

6 release files

1.1.3

6 release files

1.1.2

6 release files

1.1.0

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.11.5

2 release files

0.11.3

2 release files

0.11.1

2 release files

0.11.0

2 release files

0.9.6

2 release files

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.26

2 release files

0.7.25

2 release files

0.7.24

2 release files

0.7.23

2 release files

0.7.22

2 release files

0.7.21

2 release files

0.7.20

2 release files

0.7.19

2 release files

0.7.18

2 release files

0.7.17

2 release files

0.7.16

2 release files

0.7.15

2 release files

0.7.14

2 release files

0.7.13

2 release files

0.7.12

2 release files

0.7.9

2 release files

0.7.8

2 release files

0.7.7

2 release files

0.7.6

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.8

2 release files

0.5.7

2 release files

0.5.6

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.10

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

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