Lightweight Graph QL engine powered by SQL Alchemy
Project description
Alchemy QL
Lightweight GraphQL engine powered by SQLAlchemy
🚀 Key Features
Alchemy QL's key features include:
- Read Only - Provides read-only graphql interface into your database
- Data Type Support - Currently supported data types:
- Built in types: int, float, bool, str, bytes
- Date types: date, datetime, time
- Enums
- JSON fields
- Relationships
- Query Options - Currently supported query options:
- Filtering
- Ordering
- Pagination (using offset & limit)
- Sync & Async support
- Optimised SQL Queries
- ORM Support - Currently supported sqlalchemy orm:
- Declarative base with mapping
- Classic declarative base
ℹ️ Installation
# Using pip
pip install alchemyql
# Using poetry
poetry add alchemyql
# Using uv
uv add alchemyql
# With FastAPI Extension
uv add alchemyql[fastapi]
📦 Dependencies
- Sqlalchemy (v2)
- Graph QL Core
📘 How to use
Step 1 - Create your Alchemy QL engine (sync or async):
from alchemyql import AlchemyQLSync, AlchemyQLAsync
sync_engine = AlchemyQLSync()
async_engine = AlchemyQLSync()
Step 2 - Register your sqlalchemy tables:
from your_db import Table
engine.register(
Table,
include_fields=["field_one", "field_two"],
filter_fields=["field_one"],
order_fields=["field_one"],
pagination=True,
max_limit=100
...
)
Step 3 - Build your schema:
engine.build_schema()
Step 4 - Run queries:
query = "query { table { field } }"
db = session_factory() # SQLAlchemy DB session
# Sync Variation
res = sync_engine.execute_query(query=query, db_session=db)
# Async Variation
res = await async_engine.execute_query(query=query, db_session=db)
📘 Supported Options
Engine Creation:
| Key | Type | Default | Description |
|---|---|---|---|
| max_query_depth | int | None | The maximum depth allowed for nested queries |
Registering Table:
| Key | Type | Default | Description |
|---|---|---|---|
| graphql_name | str | None | Customise the graphql type name (defaults to sql tablename) |
| description | str | None | Customise the graphql type descripton |
| query | bool | True | Whether to allow direct querying of table |
| include_fields | list[str] | None | Allow only specific fields to be exposed |
| exclude_fields | list[str] | [] | Block specific fields from being exposed |
| relationships | list[str] | [] | Relationships to be exposed (target table must be registered aswell) |
| filter_fields | list[str] | [] | Allow filtering for specific fields |
| order_fields | list[str] | [] | Allow ordering for specific fields |
| default_order | dict[str, Order] | None | Default order to apply to queries |
| pagination | bool | False | Whether to support pagination |
| default_limit | int | None | Default number of records that can be returned in 1 query |
| max_limit | int | None | Maximum number of records that can be returned in 1 query |
NOTE: if you do not specify include_fields or exclude_fields it will default expose all fields.
NOTE: if you specify query=False, then all filtering & ordering & pagination is disabled. This is for the case where a table should only be available via a relationship
Filtering Options:
| Type | Supported Filters |
|---|---|
| int | eq, ne, gt, ge, lt, le, in |
| float | eq, ne, gt, ge, lt, le, in |
| bool | eq, ne |
| str | eq, ne, contains, startswith, endswith, in |
| date | eq, ne, gt, ge, lt, le, in |
| datetime | eq, ne, gt, ge, lt, le, in |
| time | eq, ne, gt, ge, lt, le, in |
| Enum | eq, ne, in |
All other types are not currently supported for filtering.
📘 Logging
AlchemyQL uses the "alchemyql" logger.
Other docs can be found in: docs/
📘 Extensions
AlchemyQL has the following extensions:
- FastAPI - sync and async pre-created routers available (see Doc )
ℹ️ License
This project is licensed under the terms of the MIT license.
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 alchemyql-0.0.3.tar.gz.
File metadata
- Download URL: alchemyql-0.0.3.tar.gz
- Upload date:
- Size: 11.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92f6961aa56505d082754309bab793f3ca31f781bfec43243ae4835ebc17a30f
|
|
| MD5 |
f6a8a00ad2016ace057c8208eadc0ee6
|
|
| BLAKE2b-256 |
cdc09928bc00254f07f6c1d7ced6bc9f25899d417ea46a8118b78450a4948caa
|
File details
Details for the file alchemyql-0.0.3-py3-none-any.whl.
File metadata
- Download URL: alchemyql-0.0.3-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4042b0ad25ed34b1abc269b5085b5fe4b2b11ba961ef0dfadafa15bd44b9317
|
|
| MD5 |
6bf1492d809be105b8a7c27dcd3732cb
|
|
| BLAKE2b-256 |
a01c7d454f0453f9507d754468af154b69f87fbd60bfa9ca9569cd6138762e29
|