Graphene SQLAlchemy integration
Version 3.0 is in beta stage. Please read https://github.com/graphql-python/graphene-sqlalchemy/issues/348 to learn about progress and changes in upcoming beta releases.
Graphene-SQLAlchemy
A SQLAlchemy integration for Graphene.
Installation
For installing Graphene, just run this command in your shell.
pip install --pre "graphene-sqlalchemy"
Examples
Here is a simple SQLAlchemy model:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class UserModel(Base): tablename = 'user' id = Column(Integer, primary_key=True) name = Column(String) last_name = Column(String)
To create a GraphQL schema for it, you simply have to write the following:
import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType
class User(SQLAlchemyObjectType): class Meta: model = UserModel # use only_fields to only expose specific fields ie "name" # only_fields = ("name",) # use excludefields to exclude specific fields ie "lastname" # excludefields = ("lastname",)
class Query(graphene.ObjectType): users = graphene.List(User)
def resolve_users(self, info): query = User.get_query(info) # SQLAlchemy query return query.all()
schema = graphene.Schema(query=Query)
We need a database session first:
from sqlalchemy import (create_engine)
from sqlalchemy.orm import (scoped_session, sessionmaker)
engine = createengine('sqlite:///database.sqlite3', convertunicode=True) dbsession = scopedsession(sessionmaker(autocommit=False, autoflush=False, bind=engine))
We will need this for querying, Graphene extracts the session from the base.
Alternatively it can be provided in the GraphQLResolveInfo.context dictionary under context["session"]
Base.query = dbsession.queryproperty()
Then you can simply query the schema:
query = '''
query {
users {
name,
lastName
}
}
'''
result = schema.execute(query, contextvalue={'session': dbsession})
You may also subclass SQLAlchemyObjectType by providing abstract = True in your subclasses Meta:
from graphene_sqlalchemy import SQLAlchemyObjectType
class ActiveSQLAlchemyObjectType(SQLAlchemyObjectType): class Meta: abstract = True
@classmethod def get_node(cls, info, id): return cls.get_query(info).filter( and(cls.meta.model.deleted_at==None, cls._meta.model.id==id) ).first()
class User(ActiveSQLAlchemyObjectType): class Meta: model = UserModel
class Query(graphene.ObjectType): users = graphene.List(User)
def resolve_users(self, info): query = User.get_query(info) # SQLAlchemy query return query.all()
schema = graphene.Schema(query=Query)
Full Examples
To learn more check out the following examples:
Contributing
See CONTRIBUTING.md