Support/help with promise-based resolvers
Avaliação
Esta issue ainda não foi avaliada.
Descrição
I think I have a good use-case for non-async, promise-based resolution.
We are making django ORM from our dataloaders. We moved away from using async in django 3.0 because django would force us to isolate ORM calls and wrap them in sync_to_async. Instead, we ditched async and used promises with a generator based syntax. Examples below:
What we'd like to do, but django doesn't allow
class MyDataLoader(...):
async def batch_load(self, ids):
data_from_other_loader = await other_loader.load_many(ids)
data_from_orm = MyModel.objects.filter(id__in=ids) # error! can't call django ORM from async context.
# return processed combination of orm/loader data
What django would like us to do
class MyDataLoader(...):
async def batch_load(self, ids):
data_from_other_loader = await other_loader.load_many(ids)
data_from_orm = await get_orm_data()
# return processed combination of orm/loader data
@sync_to_async
def get_orm_data(ids):
return MyModel.objects.filter(id__in=ids)
What we settled on instead (ditch async, use generator-syntax around promises)
class MyDataLoader(...):
def batch_load(self,ids):
data_from_other_loader = yield other_loader.load_many(ids)
data_from_orm = MyModel.objects.filter(id__in=ids)
# return processed combination of orm/loader data
I have a generator_function_to_promise tool that allows this syntax, as well as a middleware that converts generators returned from resolvers into promises. I have hundreds of dataloaders following this pattern. I don't want to be stuck isolating all the ORM calls as per django's recommendations because it's noisy and decreases legibility.
If it's not difficult to re-add promise support, I'd really appreciate it. If not, can anyone think of a solution to my problem?
- Linguagem predominante
- Python
- Estrelas
- 531
- Forks
- 150
- Merge médio
- 1d 16h
- PRs com merge (30d)
- 5
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Sem guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de graphql-python/graphql-core
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 35/100
graphql-python/graphql-core#278 ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 45/100
graphql-python/graphql-core#257 ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 35/100
graphql-python/graphql-core#223 · 1 comentário ·
-
documentation good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 35/100
graphql-python/graphql-core#220 · 4 comentários ·
-
help wanted investigate
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
graphql-python/graphql-core#217 · 8 comentários ·
Todas as issues de graphql-python/graphql-core
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
EvaluationSuite.run fails with default args_for_task and mutates supplied kwargsTalvez já em andamento @ktz03 assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
huggingface/evaluate#825 ·
Mantenedores costumam responder em até 1 dia
-
dependencies feature github_actions good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
wemake-services/wemake-django-template#3149 ·
Mantenedores costumam responder em até 1 dia
-
[request] vsg/1.1.16Abertaupstream update
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
conan-io/conan-center-index#31142 ·
Mantenedores costumam responder em até 1 dia
-
area:core bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia