Skip to main content

Strawberry GraphQL helpers for SQLAlchemy models.

Project description

strawberry-chemist

Explicit GraphQL types. Smart SQLAlchemy loading.

  • mapped fields
  • computed fields
  • scoped relationships
  • queryable connections
  • filters and ordering
  • relay IDs
  • node lookup
  • selection-aware dataloading

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

Installation

pip install strawberry-chemist

What It Looks Like

Computed field from selected columns:

import strawberry_chemist as sc


@sc.type(model=BookModel)
class Book:
    @sc.field(select=["title", "isbn"])
    def title_with_isbn(self, title: str, isbn: str) -> str:
        return f"{title} ({isbn})"

Queryable relationship-backed connection:

import strawberry_chemist as sc


@sc.type(model=AuthorModel)
class Author:
    books: sc.Connection[Book] = sc.connection(
        source="books",
        filter=BookFilter,
        order=BookOrder,
        pagination=sc.CursorPagination(max_limit=20),
    )

Server-scoped relationship-backed field:

import strawberry_chemist as sc
from strawberry_chemist.gql_context import context_var


@sc.type(model=BookModel)
class Book:
    @sc.relationship(
        "bookmarks",
        where=lambda: BookmarkModel.user_id == context_var.get().current_user_id,
        select=["id"],
    )
    def is_bookmarked(self, bookmarks: list[BookmarkModel]) -> bool:
        return bool(bookmarks)

Note: current_user_id is up to you to implement, the package doesn't ship auth.

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

Serve a seeded sample schema locally:

uv sync --group dev
make example-serve EXAMPLE=03_connections_filters_and_ordering PORT=8000

The contract examples tests under examples/ can run in two modes.

Against the current checkout:

make example-test EXAMPLE=03_connections_filters_and_ordering

Against the pinned published package:

make example-test-published EXAMPLE=03_connections_filters_and_ordering

Print a sample schema:

make example-schema EXAMPLE=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 with either:

uv run pytest
make test

Run formatting and type checks:

uv run pre-commit run --all-files
uv run mypy
make mypy
make check

Release notes live in CHANGELOG.md. Current limitations are documented in LIMITATIONS.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

strawberry_chemist-0.2.3.tar.gz (154.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

strawberry_chemist-0.2.3-py3-none-any.whl (42.3 kB view details)

Uploaded Python 3

File details

Details for the file strawberry_chemist-0.2.3.tar.gz.

File metadata

  • Download URL: strawberry_chemist-0.2.3.tar.gz
  • Upload date:
  • Size: 154.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for strawberry_chemist-0.2.3.tar.gz
Algorithm Hash digest
SHA256 2f66dc1c73d2ad54016d8ceadebf1aba1a906e23ace55b32842c3fc9384e08cd
MD5 9204dc5bcecee6200191dad8f5ee5127
BLAKE2b-256 1123dae3f577edac30f703bb5b96ab289af10892dd9ddb5e89d794f49237469d

See more details on using hashes here.

Provenance

The following attestation bundles were made for strawberry_chemist-0.2.3.tar.gz:

Publisher: publish.yml on MeRuslan/strawberry-chemist

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file strawberry_chemist-0.2.3-py3-none-any.whl.

File metadata

File hashes

Hashes for strawberry_chemist-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 3f78255fb92325e48bf8d64bff2649f67fa262b0e098ff72be6987389c34736a
MD5 fca04d5867b3606c18ecc4e7ddcae38f
BLAKE2b-256 a612c7fe0eff7dff59c06eec0a60ae9eb9eacf42b746b24eafbd6d73564c6860

See more details on using hashes here.

Provenance

The following attestation bundles were made for strawberry_chemist-0.2.3-py3-none-any.whl:

Publisher: publish.yml on MeRuslan/strawberry-chemist

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page