graphql-python / graphql-python/flask-graphql

Connect to multiple data sources in same app

Aberta
#57 0 comentários 1 reação 0 responsáveis Ver no GitHub
Linguagem predominante
Python
Estrelas
1.3k
Forks
139
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

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](http://docs.graphene-python.org/projects/sqlalchemy/en/latest/)

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()

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Direção de pesquisa

Comece rastreando o tratamento de get_context por GraphQLView e como SQLAlchemyConnectionField obtém sua sessão; em seguida, compare o comportamento solicitado com Graphene-SQLAlchemy. A issue não fornece arquivos do repositório nem testes específicos como alvo. O trabalho estará concluído quando várias fontes de dados configuradas funcionarem em um único app, mantendo SQLAlchemyConnectionField e as extensões relacionadas sem workarounds de sessão específicos do resolver.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
flask, graphql, python, sqlalchemy
Domínio
api, backend, database
Tipo de issue
Funcionalidade
Dificuldade
5/5
Tempo estimado
Mais de uma semana
Status de atividade
Estagnada
Clareza
Precisa de esclarecimento
Facilidade para iniciantes
25/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.