v7.5.0
A new release of the Swift toolkit for SQLite databases.
GRDB 7.5.0 brings a new way to write database requests
// GRDB 7.4
let count = try Player.filter(Column("score") >= 1000).fetchCount(db)
let players = try Player.order(Column("score")).fetchAll(db)
// NEW with GRDB 7.5.0
let count = try Player.filter { $0.score >= 1000 }.fetchCount(db)
let players = try Player.order(\.score).fetchAll(db)
Record types profit from this new syntax if they define a nested Columns
enum. If you follow the Recommended Practices for Designing Record Types, this Columns
enum is already defined, and you can profit from the new syntax right away.
With Swift 6.1+, Table Aliases have learned to use the Columns
enum:
// GRDB 7.4
let authorAlias = TableAlias()
let request = Book
.joining(required: Book.author.aliased(authorAlias))
.order(authorAlias[Column("name")], Column("publishDate"))
// NEW with GRDB 7.5.0 and Swift 6.1
let authorAlias = TableAlias<Author>()
let request = Book
.joining(required: Book.author.aliased(authorAlias))
.order { [authorAlias.name, $0.publishDate] }
Breaking Changes
The benefits of this release are so important that two breaking changes were shipped:
-
If you define a
public
record type with a nestedColumns
enum, you have to make this enumpublic
as well.public struct Player: FetchableRecord, PersistableRecord { - enum Columns { ... } + public enum Columns { ... } }
-
TableAlias
is now a generic type. This will break existing code that accepts aTableAlias
as an argument. You will have to make those methods generic as well.
What's Changed
- Make it possible to create a raw FTS5Pattern without any database connection by @groue in #1764
- Build request with closures by @groue in #1759
Full Changelog: v7.4.1...v7.5.0