GraphQL AWS AMplify @connection no trae datos conectados
Me gustaría tener en las tablas de la Liga todas las temporadas y divisiones como puedes ver con data > seasons. Lo configuré como creo que funcionaría usando @connection.
Entonces, la pregunta es, ¿cómo tendría que cambiar mi esquema de división para que las divisiones se incluyan en el League.
He pasado un buen rato leyendo @connections & @key y entiendo que al usar la clave se crea un hash con el IDque les he dado. Pero no entiendo lo suficiente después de haber leído la documentación de conexiones varias veces en cuanto a por qué esto no funcionaría.
Me encantaría entender esto mejor, ¡así que estoy dando todo lo que puedo para tratar de desarrollar una comprensión!
nb Creo que también vale la pena mencionar que cada vez que cambio mi esquema y amplify mockreconstruyo las claves hash, se agregan. Me pregunto si esto tiene algún impacto. ¿Debería limpiar el SQLite por completo con cada cambio de esquema cuando hay claves involucradas?
Esquema de liga
type League @model
{
id: ID!
name: String!
faId: ID!
logo: String
seasons: [Season] @connection(keyName: "bySeason", fields: ["id"])
division: [Division] @connection(keyName: "byDivision", fields: ["id"])
}
Temporadas Schama
type Season @model @key(name: "bySeason", fields: ["leagueID"])
{
id: ID!
name: String!
faId: ID!
yearStart: AWSDate
yearEnd: AWSDate
leagueID: ID!
league: League! @connection(fields: ["leagueID"])
division: [Division] @connection(keyName: "byDivision", fields: ["id"])
}
Esquema de división
type Division @model
@key(name: "byDivisionFromSeason", fields: ["leagueID" "name"])
@key(name: "byDivision", fields: ["seasonID", "leagueID"])
{
id: ID!
name: String!
faId: ID!
divisionSeasonFaId: String
leagueID: ID!
seasonID: ID!
league: League! @connection(fields: ["leagueID"])
season: Season! @connection(fields: ["seasonID"])
teams: [TeamConnection] @connection(keyName: "byTeamDivision", fields: ["id"])
games: [Game] @connection(keyName: "byGameForDivision", fields: ["id"])
ageInput: String!
level: Int!
}
Consultas
listLeagues {
items {
name
division {
items {
name
}
}
seasons {
items {
name
division {
items {
name
}
}
}
}
}
}
Datos
He demostrado aquí que la estructura es correcta, ya que se Seasonsincluye en Leagueel Divisionsmodo esperado
{
"data": {
"listLeagues": {
"items": [
{
"name": "Southern Amateur League",
"division": {
"items": []
},
"seasons": {
"items": [
{
"name": "2020-21",
"division": {
"items": [
{
"name": "Junior Section Division 5B South"
},
{
"name": "Junior Section Division 4 South"
},
{
"name": "Intermediate Division 3"
},
]
}
},
{
"name": "2019-20",
"division": {
"items": []
}
},
]
}
}
]
}
}
}
Editar
Dado que se reducen solo las claves en la división hacia seasonIDy leagueIDen cada clave, al borrar los datos parece arrojar un error inusual. ¿Había creído que devolver nulo en una @conexión era perfectamente válido?
Respuestas
Quizás esto debería ser más un comentario que una respuesta real, pero necesito describir el esquema, lo eliminaré más adelante si lo considera apropiado.
Jamie, solo para probar, ¿puedes probar el siguiente esquema? Es básicamente el mismo esquema propuesto por Nader, simplemente eliminando el campo namede la keys en Division:
type League @model
{
id: ID!
name: String!
faId: ID!
logo: String
seasons: [Season] @connection(keyName: "bySeason", fields: ["id"])
division: [Division] @connection(keyName: "byDivision", fields: ["id"])
}
type Season @model @key(name: "bySeason", fields: ["leagueID"])
{
id: ID!
name: String!
faId: ID!
yearStart: AWSDate
yearEnd: AWSDate
leagueID: ID!
league: League! @connection(fields: ["leagueID"])
division: [Division] @connection(keyName: "byDivisionFromSeason", fields: ["id"])
}
type Division @model
@key(name: "byDivisionFromSeason", fields: ["seasonID", "leagueID"])
@key(name: "byDivision", fields: ["leagueID", "seasonID"])
{
id: ID!
name: String!
faId: ID!
divisionSeasonFaId: String
leagueID: ID!
seasonID: ID!
league: League! @connection(fields: ["leagueID"])
season: Season! @connection(fields: ["seasonID"])
teams: [TeamConnection] @connection(keyName: "byTeamDivision", fields: ["id"])
games: [Game] @connection(keyName: "byGameForDivision", fields: ["id"])
ageInput: String!
level: Int!
}
Creo que el error que obtuviste, es decir:
"errors": [ { "message": "Query condition missed key schema element", "errorType": "DynamoDB:ValidationException", "data": null, "errorInfo": null, "path": [ "listLeagues", "items", 1, "division" ], "locations": [ { "line": 10, "column": 9, "sourceName": "GraphQL request" } ] }
se puede motivar ejecutando una consulta usando la condición name.
Debido a que está configurando dos tipos diferentes de patrones de consulta en la división (uno de la Liga que usa el ID de la liga y otro de la Temporada que usa el ID de la temporada), debe crear dos índices. Intente algo como esto:
type League @model {
id: ID!
name: String!
faId: ID!
logo: String
seasons: [Season] @connection(keyName: "bySeason", fields: ["id"])
division: [Division] @connection(keyName: "byDivision", fields: ["id"])
}
type Season @model @key(name: "bySeason", fields: ["leagueID"]) {
id: ID!
name: String!
faId: ID!
yearStart: AWSDate
yearEnd: AWSDate
leagueID: ID!
league: League! @connection(fields: ["leagueID"])
division: [Division] @connection(keyName: "byDivisionFromSeason", fields: ["id"])
}
type Division @model
@key(name: "byDivisionFromSeason", fields: ["seasonID", "leagueID", "name"])
@key(name: "byDivision", fields: ["leagueID", "seasonID", "name"]) {
id: ID!
name: String!
faId: ID!
leagueID: ID!
seasonID: ID!
league: League! @connection(fields: ["leagueID"])
season: Season! @connection(fields: ["seasonID"])
ageInput: String!
level: Int!
}