Querying

Performing mutations

While queries fetch and transform data, mutations allow you to make changes - like updating records, triggering actions, or writing data to destinations.

Declaring mutable operations

Operations that perform changes are marked with the write modifier in service definitions:

service FlightsService {
   // Operation that makes changes
   write operation bookFlight(BookingRequest):BookingConfirmation
   
   // Regular query operation
   operation getFlights():Flight[]
}

Invoking mutations

While queries use the find or stream keywords, mutations use the call directive:

find { Passengers[] }
call FlightsService::sendFlightManifest

Write protection

Operations marked with `write` are excluded from being called during regular queries (i.e., in `find` or `stream` blocks). They can only be invoked using `call`.

Type conversion in mutations

TaxiQL automatically handles type conversion between your source data and the mutation operation’s input requirements:

// Source data model
model Movie {
   id: FilmId
   title: Title
}

// Target model for database
model Film {
   @Id
   filmId: FilmId
   title: Title
   reviewScore: ReviewScore  // Additional field not in source
}

service FilmDatabase {
   write operation saveFilm(Film):Film
}

// TaxiQL will automatically discover missing data
find { Movie[] }
call FilmDatabase::saveFilm

Explicit projections

You can control the transformation of data before mutation using projections:

find { Film[] } as {
   id: FilmId
   title: Title = upperCase(Title)  // Transform data before saving
   rating: ReviewScore
}
call FilmDatabase::saveFilm

Single vs batch mutations

The input type of your mutation operation determines whether data is processed individually or in batches:

service FilmService {
   // Processes one film at a time
   write operation saveSingle(Film):Film
   
   // Processes films in batches
   write operation saveBatch(Film[]):Film[]
}

Batch processing

Using array types in mutation operations signals that the operation expects to handle multiple records in a single call. This can be more efficient for bulk operations.
Previous
Querying
Next
Syntax