GraphQL AWS AMplify @connection no trae datos conectados

Oct 07 2020

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

2 jccampanero Oct 26 2020 at 06:39

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.

1 NaderDabit Oct 11 2020 at 20:01

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!
}