Middleware for the [tartiflette](https://tartiflette.io/) GraphQL server implementation to have a SQLAlchemy Session generated on each server request which is then injected into the resolver context.
Project description
Tartiflette Request SQLAlchemy Session
Middleware for the tartiflette GraphQL server implementation to have a SQLAlchemy Session generated on each server request which is then injected into the resolver context.
- A provided session is unique to the request.
- A provided session is shared across queries on a request.
- Must work for queries, mutations, and subscriptions.
Installation
pip install tartiflette-request-sqlalchemy-session[psycopg2]
Currently only supports PostgreSQL through psycopg. Pull requests for other adaptors are welcome.
Configuration
Note: If you have a working project you won't need to change the Alembic configuration. This is mainly useful for a new project.
Alembic configuration
In env.py
add:
from tartiflette_request_sa_session import Database
db_config = Database(
db='db_name',
engine='db_engine', # e.g. postgres+psycopg2
host='db_host',
password='db_password',
port='db_port',
user='db_username',
)
database = Database(**db_config)
Update env.py
to use:
config = context.config
config.set_main_option('sqlalchemy.url', database.connection_string)
App.py configuration
This configuration will not usually provide an out of the box working example of a tartiflette aiohttp setup. This should be used as guidance to fit into your configuration.
from tartiflette_middleware import Middleware, server
from tartiflette_request_sa_session import Database, SQLAlchemySessionMiddleware
def run():
# As with Alembic add:
db_manager = Database(
db='db_name',
engine='db_engine', # e.g. postgres+psycopg2
host='db_host',
password='db_password',
port='db_port',
user='db_username',
)
# database request-based middleware setup
sa_middleware = Middleware(
context_manager=SQLAlchemySessionMiddleware(db_manager=db_manager),
server_middleware=server.aiohttp,
)
# configure app - tweak to fit own configuration
app = web.Application(middlewares=[
sa_middleware.middleware,
])
engine = create_engine(
sdl=os.path.dirname(os.path.abspath(__file__)) + '/sdl',
modules=[
# configure as necessary
],
)
ctx = {
'db_session_service': sa_middleware.service,
}
web.run_app(
register_graphql_handlers(
# ... your other settings ...
executor_context=ctx,
)
)
Use
In your resolver you can now access a new session for each request.
Resolver example: query_resolvers.py
async def resolve_new_request(parent, args, ctx, info):
session = await ctx['db_session_service']()
u = session.query(YourModel).filter_by(uuid=args['uuid']).first()
return u
Notes
- Currently works using "Tartiflette Middleware" which only supports aiohttp. Other servers supporting tartiflette could be supported via pull requests on that project.
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
Hashes for tartiflette-request-sqlalchemy-session-1.0.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9b3983b7dc1bef5e4aa938d5f1a575d6d71eb44c56794137013acf8ff8d04c8e |
|
MD5 | fe6793bd604e1a5bdb0c6fbf3f1d96fd |
|
BLAKE2b-256 | d8f0698ad17ba852cf1ddd33cce88c91c4ce947a1ca0bcc679de3ba7166a5c3f |
Hashes for tartiflette_request_sqlalchemy_session-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77276e8b05e4df4a96f244badd992c257089d57a940589bdb691eab8e9a77d4b |
|
MD5 | d1f7c9dda4d93b0f983f8e099878f366 |
|
BLAKE2b-256 | e6ebe5763a66f0e9272f2b3e651cc88cbb7cc47083ac36f10d76fecca428a1c0 |