QueryInterfaceRequest
public struct QueryInterfaceRequest<RowDecoder>
extension QueryInterfaceRequest: DatabaseRegionConvertible
extension QueryInterfaceRequest: SQLRequestProtocol
extension QueryInterfaceRequest: FetchRequest
extension QueryInterfaceRequest: SelectionRequest
extension QueryInterfaceRequest: FilteredRequest
extension QueryInterfaceRequest: OrderedRequest
extension QueryInterfaceRequest: AggregatingRequest
extension QueryInterfaceRequest: _JoinableRequest
extension QueryInterfaceRequest: TableRequest
extension QueryInterfaceRequest: JoinableRequest where RowDecoder: TableRecord
extension QueryInterfaceRequest: DerivableRequest where RowDecoder: TableRecord
QueryInterfaceRequest is a request that generates SQL for you.
For example:
try dbQueue.read { db in
let request = Player
.filter(Column("score") > 1000)
.order(Column("name"))
let players = try request.fetchAll(db) // [Player]
}
-
Declaration
Swift
public func databaseRegion(_ db: Database) throws -> DatabaseRegion
-
Declaration
Swift
public func makePreparedRequest(_ db: Database, forSingleResult singleResult: Bool) throws -> PreparedRequest -
Declaration
Swift
public func fetchCount(_ db: Database) throws -> Int
-
Creates a request which selects selection promise.
// SELECT id, email FROM player var request = Player.all() request = request.select { db in [Column("id"), Column("email")] }Any previous selection is replaced:
// SELECT email FROM player request .select { db in [Column("id")] } .select { db in [Column("email")] }Declaration
Swift
public func select(_ selection: @escaping (Database) throws -> [SQLSelectable]) -> QueryInterfaceRequest -
Creates a request which selects selection, and fetches values of type type.
try dbQueue.read { db in // SELECT max(score) FROM player let request = Player.all().select([max(Column("score"))], as: Int.self) let maxScore: Int? = try request.fetchOne(db) }Declaration
Swift
public func select<RowDecoder>(_ selection: [SQLSelectable], as type: RowDecoder.Type = RowDecoder.self) -> QueryInterfaceRequest<RowDecoder> -
Creates a request which selects selection, and fetches values of type type.
try dbQueue.read { db in // SELECT max(score) FROM player let request = Player.all().select(max(Column("score")), as: Int.self) let maxScore: Int? = try request.fetchOne(db) }Declaration
Swift
public func select<RowDecoder>(_ selection: SQLSelectable..., as type: RowDecoder.Type = RowDecoder.self) -> QueryInterfaceRequest<RowDecoder> -
Creates a request which selects sql, and fetches values of type type.
try dbQueue.read { db in // SELECT max(score) FROM player let request = Player.all().select(sql: "max(score)", as: Int.self) let maxScore: Int? = try request.fetchOne(db) }Declaration
Swift
public func select<RowDecoder>( sql: String, arguments: StatementArguments = StatementArguments(), as type: RowDecoder.Type = RowDecoder.self) -> QueryInterfaceRequest<RowDecoder> -
Creates a request which selects an SQL literal, and fetches values of type type.
try dbQueue.read { db in // SELECT IFNULL(name, 'Anonymous') FROM player WHERE id = 42 let request = Player. .filter(primaryKey: 42) .select( SQLLiteral( sql: "IFNULL(name, ?)", arguments: ["Anonymous"]), as: String.self) let name: String? = try request.fetchOne(db) }With Swift 5, you can safely embed raw values in your SQL queries, without any risk of syntax errors or SQL injection:
try dbQueue.read { db in // SELECT IFNULL(name, 'Anonymous') FROM player WHERE id = 42 let request = Player. .filter(primaryKey: 42) .select( literal: "IFNULL(name, \("Anonymous"))", as: String.self) let name: String? = try request.fetchOne(db) }Declaration
Swift
public func select<RowDecoder>( literal sqlLiteral: SQLLiteral, as type: RowDecoder.Type = RowDecoder.self) -> QueryInterfaceRequest<RowDecoder> -
Creates a request which appends selection promise.
// SELECT id, email, name FROM player var request = Player.all() request = request .select([Column("id"), Column("email")]) .annotated(with: { db in [Column("name")] })Declaration
Swift
public func annotated(with selection: @escaping (Database) throws -> [SQLSelectable]) -> QueryInterfaceRequest -
Creates a request which selects the primary key of the table.
For example:
struct Player: TableRecord { ... } let playerIds = dbQueue.read { db in try Player.all().selectPrimaryKey(as: Int64.self).fetchAll(db) }For tables that have no explicit primary key, the request selects the
rowidcolumn.For tables whose primary key spans several columns, the current implementation also returns a request that selects the
rowidcolumn. Future GRDB versions may return a row value.Declaration
Swift
public func selectPrimaryKey<RowDecoder>(as type: RowDecoder.Type = RowDecoder.self) -> QueryInterfaceRequest<RowDecoder> -
Creates a request with the provided predicate promise added to the eventual set of already applied predicates.
// SELECT * FROM player WHERE 1 var request = Player.all() request = request.filter { db in true }Declaration
Swift
public func filter(_ predicate: @escaping (Database) throws -> SQLExpressible) -> QueryInterfaceRequest -
Creates a request with the provided orderings promise.
// SELECT * FROM player ORDER BY name var request = Player.all() request = request.order { _ in [Column("name")] }Any previous ordering is replaced:
// SELECT * FROM player ORDER BY name request .order{ _ in [Column("email")] } .reversed() .order{ _ in [Column("name")] }Declaration
Swift
public func order(_ orderings: @escaping (Database) throws -> [SQLOrderingTerm]) -> QueryInterfaceRequest -
Creates a request that reverses applied orderings.
// SELECT * FROM player ORDER BY name DESC var request = Player.all().order(Column("name")) request = request.reversed()If no ordering was applied, the returned request is identical.
// SELECT * FROM player var request = Player.all() request = request.reversed()Declaration
Swift
public func reversed() -> QueryInterfaceRequest -
Creates a request without any ordering.
// SELECT * FROM player var request = Player.all().order(Column("name")) request = request.unordered()Declaration
Swift
public func unordered() -> QueryInterfaceRequest -
Creates a request grouped according to expressions promise.
Declaration
Swift
public func group(_ expressions: @escaping (Database) throws -> [SQLExpressible]) -> QueryInterfaceRequest -
Creates a request with the provided predicate promise added to the eventual set of already applied predicates.
Declaration
Swift
public func having(_ predicate: @escaping (Database) throws -> SQLExpressible) -> QueryInterfaceRequest -
Creates a request that allows you to define expressions that target a specific database table.
In the example below, the “team.avgScore < player.score” condition in the ON clause could be not achieved without table aliases.
struct Player: TableRecord { static let team = belongsTo(Team.self) } // SELECT player.*, team.* // JOIN team ON ... AND team.avgScore < player.score let playerAlias = TableAlias() let request = Player .all() .aliased(playerAlias) .including(required: Player.team.filter(Column("avgScore") < playerAlias[Column("score")])Declaration
Swift
public func aliased(_ alias: TableAlias) -> QueryInterfaceRequest -
Creates a request which returns distinct rows.
// SELECT DISTINCT * FROM player var request = Player.all() request = request.distinct() // SELECT DISTINCT name FROM player var request = Player.select(Column("name")) request = request.distinct()Declaration
Swift
public func distinct() -> QueryInterfaceRequest -
Creates a request which fetches limit rows, starting at offset.
// SELECT * FROM player LIMIT 1 var request = Player.all() request = request.limit(1)Any previous limit is replaced.
Declaration
Swift
public func limit(_ limit: Int, offset: Int? = nil) -> QueryInterfaceRequest -
Creates a request bound to type RowDecoder.
The returned request can fetch if the type RowDecoder is fetchable (Row, value, record).
// Int? let maxScore = try Player .select(max(scoreColumn)) .asRequest(of: Int.self) // <-- .fetchOne(db)Declaration
Swift
public func asRequest<RowDecoder>(of type: RowDecoder.Type) -> QueryInterfaceRequest<RowDecoder>Parameters
typeThe fetched type RowDecoder
Return Value
A request bound to type RowDecoder.
-
Creates a request which appends aggregates to the current selection.
// SELECT player.*, COUNT(DISTINCT book.id) AS bookCount // FROM player LEFT JOIN book ... var request = Player.all() request = request.annotated(with: Player.books.count)Declaration
Swift
public func annotated(with aggregates: AssociationAggregate<RowDecoder>...) -> QueryInterfaceRequest -
Creates a request which appends aggregates to the current selection.
// SELECT player.*, COUNT(DISTINCT book.id) AS bookCount // FROM player LEFT JOIN book ... var request = Player.all() request = request.annotated(with: [Player.books.count])Declaration
Swift
public func annotated(with aggregates: [AssociationAggregate<RowDecoder>]) -> QueryInterfaceRequest -
Creates a request which appends the provided aggregate predicate to the eventual set of already applied predicates.
// SELECT player.* // FROM player LEFT JOIN book ... // HAVING COUNT(DISTINCT book.id) = 0 var request = Player.all() request = request.having(Player.books.isEmpty)Declaration
Swift
public func having(_ predicate: AssociationAggregate<RowDecoder>) -> QueryInterfaceRequest
-
Deletes matching rows; returns the number of deleted rows.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
@discardableResult public func deleteAll(_ db: Database) throws -> IntParameters
dbA database connection.
Return Value
The number of deleted rows
-
Updates matching rows; returns the number of updated rows.
For example:
try dbQueue.write { db in // UPDATE player SET score = 0 try Player.all().updateAll(db, [Column("score").set(to: 0)]) }Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
@discardableResult public func updateAll( _ db: Database, onConflict conflictResolution: Database.ConflictResolution? = nil, _ assignments: [ColumnAssignment]) throws -> IntParameters
dbA database connection.
conflictResolutionA policy for conflict resolution, defaulting to the record’s persistenceConflictPolicy.
assignmentsAn array of column assignments.
Return Value
The number of updated rows.
-
Updates matching rows; returns the number of updated rows.
For example:
try dbQueue.write { db in // UPDATE player SET score = 0 try Player.all().updateAll(db, Column("score").set(to: 0)) }Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
@discardableResult public func updateAll( _ db: Database, onConflict conflictResolution: Database.ConflictResolution? = nil, _ assignment: ColumnAssignment, _ otherAssignments: ColumnAssignment...) throws -> IntParameters
dbA database connection.
conflictResolutionA policy for conflict resolution, defaulting to the record’s persistenceConflictPolicy.
assignmentA column assignment.
otherAssignmentsEventual other column assignments.
Return Value
The number of updated rows.
View on GitHub
Install in Dash
QueryInterfaceRequest Structure Reference