Strawberry GraphQL helpers for SQLAlchemy models.
Project description
strawberry-chemist
strawberry-chemist helps expose SQLAlchemy models through Strawberry without
turning your GraphQL schema into generated magic.
The package is intentionally explicit. You still write the Strawberry types you want clients to see. That makes the DTO layer visible, keeps the public contract adaptable, and fits production codebases that care about query shape, permissions, loading behavior, and long-term schema maintenance.
That explicitness does not mean giving up performance. Chemist-managed relationship and connection fields are selection-aware and dataloader-backed, so you can keep explicit DTOs without falling into per-parent N+1 loading.
Chemist focuses on the parts that are repetitive and SQLAlchemy-aware:
- field mapping and renaming
- relationship loading
- root and nested connections
- filtering, ordering, and pagination
- relay IDs and node lookup
- dataloaders and selection-aware loading
Relationships and connections are also deliberately flexible. They can be:
- plain mapped fields
- renamed fields
- server-scoped fields
- relationship-backed computed fields
- root collections
- relationship-backed collections with filtering, ordering, and pagination
Installation
pip install strawberry-chemist
Supported Python versions:
3.113.12
Quick example
import strawberry
import strawberry_chemist as sc
@sc.node(model=BookModel)
class Book:
title: str
published_year: int = sc.attr("year")
@sc.filter(model=BookModel)
class BookFilter(sc.FilterSet):
title: sc.StringFilter = sc.filter_field()
@sc.order(model=BookModel)
class BookOrder:
published_year = sc.order_field(path="year")
@strawberry.type
class Query:
node = sc.node_field()
books: sc.Connection[Book] = sc.connection(
filter=BookFilter,
order=BookOrder,
pagination=sc.CursorPagination(max_limit=20),
)
schema = strawberry.Schema(query=Query, extensions=sc.extensions())
Your GraphQL context must provide a get_session() async context manager that
returns a SQLAlchemy AsyncSession.
Public docs
The public docs live in docs/. The published site is intended for GitHub Pages and is built with MkDocs.
Useful entrypoints:
Serve the docs locally:
uv sync --group dev
uv run mkdocs serve
Build the docs locally:
uv run mkdocs build --strict
Runnable examples
The contract examples under examples/v0_2_api/ can run in two modes.
Against the current checkout:
scripts/run-example-local 03_connections_filters_and_ordering
Against the pinned published package:
scripts/run-example-published 03_connections_filters_and_ordering
If you want to force published-mode testing against a locally built
distribution, point the script at a build output directory:
uv run python -m build --outdir /tmp/strawberry-chemist-dist
STRAWBERRY_CHEMIST_FIND_LINKS=/tmp/strawberry-chemist-dist \
scripts/run-example-published 03_connections_filters_and_ordering
API overview
- Types and fields:
@sc.type,@sc.node,sc.attr,@sc.field - Relationships:
sc.relationship(...) - Collections:
sc.connection(...),sc.Connection,sc.OffsetConnection - Pagination:
sc.CursorPagination,sc.OffsetPagination,sc.PaginationPolicy - Filters:
@sc.filter,sc.FilterSet,sc.filter_field,sc.manual_filter - Ordering:
@sc.order,sc.order_field,sc.manual_order - Relay:
sc.node_field(),sc.node_lookup(...) - Schema integration:
sc.extensions()
Each part of the surface has a dedicated public docs page and at least one example reference in docs/examples.md.
Development
Run the default non-Postgres test suite:
uv run pytest
Run formatting and type checks:
uv run pre-commit run --all-files
uv run mypy
Release notes live in CHANGELOG.md. Current limitations are documented in LIMITATIONS.md.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file strawberry_chemist-0.2.1.tar.gz.
File metadata
- Download URL: strawberry_chemist-0.2.1.tar.gz
- Upload date:
- Size: 172.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0705dd22f6395562dd1ee6b3d542220c9a96919ce32350f217220bc507262be
|
|
| MD5 |
379ca09162787eeb2d025a58ff31b900
|
|
| BLAKE2b-256 |
8408487fd4e360003f9baa75c27f61bf2f9c9867d90fce96cf4d5c998472dced
|
Provenance
The following attestation bundles were made for strawberry_chemist-0.2.1.tar.gz:
Publisher:
publish.yml on MeRuslan/strawberry-chemist
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
strawberry_chemist-0.2.1.tar.gz -
Subject digest:
f0705dd22f6395562dd1ee6b3d542220c9a96919ce32350f217220bc507262be - Sigstore transparency entry: 1079990526
- Sigstore integration time:
-
Permalink:
MeRuslan/strawberry-chemist@474eefa082351b5fc279789d9fc52ae71262e60e -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/MeRuslan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@474eefa082351b5fc279789d9fc52ae71262e60e -
Trigger Event:
release
-
Statement type:
File details
Details for the file strawberry_chemist-0.2.1-py3-none-any.whl.
File metadata
- Download URL: strawberry_chemist-0.2.1-py3-none-any.whl
- Upload date:
- Size: 42.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd1df3a9a6049b3d2b71b0b5110d99b7004fd607078af25e36e9c5f42f51326b
|
|
| MD5 |
d9ccd11080f869fa153fef9564532f23
|
|
| BLAKE2b-256 |
1fa4d26df5e048877b7d1d93595f79dab224c104140274fcfcaa8a10103f306c
|
Provenance
The following attestation bundles were made for strawberry_chemist-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on MeRuslan/strawberry-chemist
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
strawberry_chemist-0.2.1-py3-none-any.whl -
Subject digest:
dd1df3a9a6049b3d2b71b0b5110d99b7004fd607078af25e36e9c5f42f51326b - Sigstore transparency entry: 1079990578
- Sigstore integration time:
-
Permalink:
MeRuslan/strawberry-chemist@474eefa082351b5fc279789d9fc52ae71262e60e -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/MeRuslan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@474eefa082351b5fc279789d9fc52ae71262e60e -
Trigger Event:
release
-
Statement type: