GitHub - graphql-python/graphene-sqlalchemy: Graphene SQLAlchemy integration (original) (raw)

Version 3.0 is in beta stage. Please read #348 to learn about progress and changes in upcoming beta releases.


Graphene Logo Graphene-SQLAlchemy

Build Status PyPI version GitHub release (latest by date including pre-releases) codecov

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 exclude_fields to exclude specific fields ie "last_name" # exclude_fields = ("last_name",)

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 = create_engine('sqlite:///database.sqlite3', convert_unicode=True) db_session = scoped_session(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 = db_session.query_property()

Then you can simply query the schema:

query = ''' query { users { name, lastName } } ''' result = schema.execute(query, context_value={'session': db_session})

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