Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Connect to multiple data sources in same app #57

Open
johnnymetz opened this issue Nov 29, 2018 · 0 comments
Open

Connect to multiple data sources in same app #57

johnnymetz opened this issue Nov 29, 2018 · 0 comments

Comments

@johnnymetz
Copy link

It appears I can only bind a single SQLAlchemy session to an app at once via the context variable:

from flask import Flask
from flask_graphql import GraphQLView
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from schema import schema

# connect to database sources
engine1 = create_engine('sqlite:///db1.sqlite3')
engine2 = create_engine('sqlite:///db2.sqlite3')
session1 = scoped_session(sessionmaker(bind=engine1))
session2 = scoped_session(sessionmaker(bind=engine2))

# create app and add GraphiQL route
app = Flask(__name__)
app.add_url_rule('/graphql', view_func=GraphQLView.as_view(
    'graphql',
    schema=schema,
    graphiql=True,
    get_context=lambda: {'session': session1}
))

Is there any way to connect to more than one data source at once or is this not possible?

If not, Flask-SQLAlchemy handles this well by binding the data source name to the sqlalchemy model. I'd recommend doing something similar: http://flask-sqlalchemy.pocoo.org/2.3/binds/

I figured out a workaround by specifying the right session in the GraphQL query but this seems very hacky and prevents me from using nice extensions like Graphene-SQLAlchemy

class Query(ObjectType):
    node = relay.Node.Field()

    # requires session1 (both resolvers work because default session is session1)
    all_employees = SQLAlchemyConnectionField(EmployeeConnections)
    employees = graphene.List(EmployeeNode, name=graphene.String())

    # requires session2
    all_departments = SQLAlchemyConnectionField(DepartmentConnections)  # can't do this because default session is session1
    departments = graphene.List(DepartmentNode, name=graphene.String())

    def resolve_departments(self, info, **kwargs):
        name = kwargs.get('name')
        if not name:
            raise GraphQLError('Name argument is required.')
        return session2.query(Department).filter_by({'name': kwargs.get('name')}).all()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant