graphql-python / graphql-python/graphene-sqlalchemy

Invalid id format when retrieving node

Aberta
#88 0 comentários 0 reações 0 responsáveis Ver no GitHub
Linguagem predominante
Python
Estrelas
985
Forks
223
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

Im having issues retrieving nodes by id that have composed primary keys.

I was getting an error:

> File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 846, in _get_impl
> ','.join("'%s'" % c for c in mapper.primary_key))
> InvalidRequestError: Incorrect number of values in identifier to formulate primary key for query.get(); primary key columns are xxxxxxxx
>

So I override **_get_node_** method to see what I was receiving as id and this it:
```
ID TYPE:
ID: (1L, '1')
```

So I had to fix it by turning that unicode id into a list, trying to re-build the primary key of the schema's model, using sqlalchemy mappers:
```python
@classmethod
def get_node(cls, info, id):
id_parts = id.strip('()').split(',')
parts = []
pk = cls._meta.model.__mapper__.primary_key
for n, k in enumerate(pk):
part = id_parts[n].strip()
p_type = k.type.python_type
if p_type in (int, long, float):
if unicode.isalpha(part[-1]):
part = part[:-1]
parts.append(p_type(part))

else:
# remove inner string/unicode repr
stripped_part = re.sub(r"[u]?'(.*?)'", "\\1", part)
parts.append(stripped_part)

return cls.get_query(info).get(parts)
```

@syrusakbary I'm wondering why I'm getting a unicode when the ```SQLAlchemyObjectType.resolve_id``` returns a tuple

Guia de contribuição

Abrir o guia de contribuição

Direção de pesquisa

Start with SQLAlchemyObjectType.resolve_id and the overridden get_node method shown in the issue, then compare how the tuple identifier is serialized before SQLAlchemy Query.get receives it. Reproduce retrieval with a model using composite primary keys and inspect the identifier type and value at each step. Done means composite-key node IDs are decoded consistently and retrieval no longer raises the identifier-count error.

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

Avaliação

Stack de tecnologia
graphql, python, sqlalchemy
Domínio
api, backend, database
Tipo de issue
Bug
Dificuldade
4/5
Tempo estimado
3-5 dias
Status de atividade
Estagnada
Clareza
Precisa de esclarecimento
Facilidade para iniciantes
30/100

Receba novas issues na sua caixa de entrada

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