graphene-sqlalchemy icon indicating copy to clipboard operation
graphene-sqlalchemy copied to clipboard

Invalid id format when retrieving node

Open sebastiandev opened this issue 7 years ago • 0 comments

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: <type 'unicode'>
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:

    @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

sebastiandev avatar Nov 16 '17 14:11 sebastiandev