SkillByAIOpen interactive version →

Lesson 23 / 25

Evolving the Schema

Change without versioning.

Add, deprecate, remove

GraphQL APIs usually evolve without version numbers. Adding types, fields and optional arguments is non-breaking, because existing queries do not ask for them. To replace a field, add the new one, mark the old one @deprecated(reason: ...), monitor field usage until clients migrate, then remove it. Breaking changes include removing or renaming fields, making nullable fields non-null in inputs or non-null fields nullable in outputs in ways clients rely on, and changing types. Schema checks in CI compare changes against the published schema and real client usage.

Deprecating a field

GraphQL SDL.

type Product {
  id: ID!
  name: String!
  price: Float! @deprecated(reason: "Use priceMoney, which includes currency.")
  priceMoney: Money!
}

type Money {
  amount: String!     # decimal string avoids float rounding
  currency: String!
}

Track field usage

Operation and field usage metrics tell you when a deprecated field is safe to remove.

Quick check: Which schema change is non-breaking?

  • Adding a new optional field
  • Removing a field
  • Renaming a field
  • Changing a field from String to Int
Answer

Adding a new optional field — Existing queries are unaffected.