Graphene SQLAlchemy Filter

1.14.0 · active · verified Fri Apr 17

graphene-sqlalchemy-filter provides a flexible way to generate GraphQL filter arguments for SQLAlchemy models, enabling complex queries and sorting directly through your GraphQL API. As of version 1.14.0, it offers robust filtering capabilities compatible with SQLAlchemy 1.4+ and Graphene SQLAlchemy integrations. The library maintains an active development pace, regularly releasing updates with bug fixes and feature enhancements.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to set up a basic GraphQL schema using `graphene-sqlalchemy-filter` with an in-memory SQLite database. It defines SQLAlchemy models, Graphene object types, and `FilterSet` classes. The `FilterableConnectionField` is then used in the root query to enable filtering and pagination on collections of objects. The example populates some initial data and sets up a runnable schema.

import graphene
import sqlalchemy as sa
from sqlalchemy.orm import declarative_base, sessionmaker, relationship
from graphene_sqlalchemy import SQLAlchemyObjectType
from graphene_sqlalchemy_filter import FilterableConnectionField, FilterSet

# 1. Setup SQLAlchemy (using in-memory SQLite for example)
Base = declarative_base()

class UserModel(Base):
    __tablename__ = 'users'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.String, nullable=False)
    email = sa.Column(sa.String, unique=True, nullable=False)
    posts = relationship("PostModel", back_populates="author")

class PostModel(Base):
    __tablename__ = 'posts'
    id = sa.Column(sa.Integer, primary_key=True)
    title = sa.Column(sa.String, nullable=False)
    content = sa.Column(sa.String)
    author_id = sa.Column(sa.Integer, sa.ForeignKey('users.id'))
    author = relationship("UserModel", back_populates="posts")

engine = sa.create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

# Add some initial data
user1 = UserModel(name="Alice", email="alice@example.com")
user2 = UserModel(name="Bob", email="bob@example.com")
session.add_all([user1, user2])
session.commit()
session.refresh(user1)
session.refresh(user2)

post1 = PostModel(title="First Post", content="Hello world", author=user1)
post2 = PostModel(title="Second Post", content="Another one", author=user2)
session.add_all([post1, post2])
session.commit()

# 2. Define Graphene ObjectTypes
class Post(SQLAlchemyObjectType):
    class Meta:
        model = PostModel
        interfaces = (graphene.relay.Node,)

class User(SQLAlchemyObjectType):
    class Meta:
        model = UserModel
        interfaces = (graphene.relay.Node,)

# 3. Define FilterSet for your models
class UserFilter(FilterSet):
    class Meta:
        model = UserModel
        fields = {
            'name': ['eq', 'like'],
            'email': ['eq'],
            'id': ['eq', 'in']
        }

class PostFilter(FilterSet):
    class Meta:
        model = PostModel
        fields = {
            'title': ['eq', 'like'],
            'content': ['like'],
            'author_id': ['eq'],
        }

# 4. Define your Graphene Query with FilterableConnectionField
class Query(graphene.ObjectType):
    node = graphene.relay.Node.Field()

    all_users = FilterableConnectionField(User.connection, filters=UserFilter())
    all_posts = FilterableConnectionField(Post.connection, filters=PostFilter())

    def resolve_all_users(root, info, **kwargs):
        return User.get_query(info).session(session)

    def resolve_all_posts(root, info, **kwargs):
        return Post.get_query(info).session(session)

schema = graphene.Schema(query=Query)

# Example GraphQL query (for demonstration, not part of quickstart output)
# query = """
#     query {
#       allUsers(filters: {name_like: "Ali"}) {
#         edges {
#           node {
#             id
#             name
#             email
#             posts {
#                 edges {
#                     node {
#                         title
#                     }
#                 }
#             }
#           }
#         }
#       }
#       allPosts(filters: {title_eq: "First Post"}) {
#         edges {
#           node {
#             title
#             author {
#               name
#             }
#           }
#         }
#       }
#     }
# """
# result = schema.execute(query)
# if result.errors: print(result.errors)
# else: print(result.data)

view raw JSON →