graphql-python / graphql-python/graphene-sqlalchemy

Query picking shadowed property when property name is `id` with different column name and second property vice versa.

Abierto
#412 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Python
Estrellas
985
Forks
223
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Hello👋,
this works as expected:
```python
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, mapped_column, Mapped, DeclarativeBase
from graphene import Field, ObjectType, Schema
from graphene_sqlalchemy import SQLAlchemyObjectType

class Base(DeclarativeBase):
pass

class Foo(Base):
__tablename__ = "foo"
bar: Mapped[int] = mapped_column(
"spam",
primary_key=True,
)
spam: Mapped[str] = mapped_column("baz")

foo = Foo(bar=3, spam="ham")
engine = create_engine("sqlite:///test.sqlite3")
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(foo)
session.commit()

class FooNode(SQLAlchemyObjectType):
class Meta:
model = Foo

class Query(ObjectType):
foo = Field(FooNode)

def resolve_foo(self, info):
with Session(engine) as session:
return session.query(Foo).first()

schema = Schema(query=Query)

result = schema.execute(
"""
{
foo {
spam
}
}
"""
)
print(result.data["foo"]["spam"]) # prints 'ham'

```

but as soon as you change `spam` to `id` it prints the value of the property `bar`:

```python
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, mapped_column, Mapped, DeclarativeBase
from graphene import Field, ObjectType, Schema
from graphene_sqlalchemy import SQLAlchemyObjectType

class Base(DeclarativeBase):
pass

class Foo(Base):
__tablename__ = "foo"
bar: Mapped[int] = mapped_column(
"id",
primary_key=True,
)
id: Mapped[str] = mapped_column("baz")

foo = Foo(bar=3, id="ham")
engine = create_engine("sqlite:///test.sqlite3")
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(foo)
session.commit()

class FooNode(SQLAlchemyObjectType):
class Meta:
model = Foo

class Query(ObjectType):
foo = Field(FooNode)

def resolve_foo(self, info):
with Session(engine) as session:
return session.query(Foo).first()

schema = Schema(query=Query)

result = schema.execute(
"""
{
foo {
id
}
}
"""
)
print(result.data["foo"]["id"]) # prints 3 but should print 'ham'
```

I believe that is a bug 🐛

Best, Ueli

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.