graphql-python / graphql-python/graphene-sqlalchemy
Invalid id format when retrieving node
- 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
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