Version 3.0 is in beta stage. Please read #348 to learn about progress and changes in upcoming beta releases.
A SQLAlchemy integration for Graphene.
For installing Graphene, just run this command in your shell.
pip install --pre "graphene-sqlalchemy"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)To learn more check out the following examples:
See CONTRIBUTING.md
