try dbQueue.write { db in try db.execute( sql: "INSERT INTO player (name, score) VALUES (?, ?)", arguments: ["Barbara", 1000])}
try dbQueue.write { db in try db.execute( sql: "INSERT INTO player (name, score) VALUES (:name, :score)", arguments: ["name": "Barbara", "score": 1000])}
try dbQueue.write { db in let name = "O'Brien" let score = 550 try db.execute(literal: """ INSERT INTO player (name, score) VALUES (\(name), \(score)) """)}
After an INSERT statement, you can get the row ID of the inserted row:
try dbQueue.write { db in try db.execute( sql: "INSERT INTO player (name, score) VALUES (?, ?)", arguments: ["Arthur", 1000]) let playerId = db.lastInsertedRowID print("Inserted player with id: \(playerId)")}
try dbQueue.write { db in try db.execute( sql: "UPDATE player SET score = ? WHERE name = ?", arguments: [2000, "Arthur"]) let changedRows = db.changesCount if changedRows == 0 { print("No player named Arthur found") }}
try dbQueue.write { db in try db.execute( sql: "DELETE FROM player WHERE score < ?", arguments: [500])}
try dbQueue.write { db in try db.execute(sql: "DELETE FROM player")}
try dbQueue.write { db in let deletedNames = try String.fetchAll(db, sql: """ DELETE FROM player WHERE score < 500 RETURNING name """) print("Deleted players: \(deletedNames.joined(separator: ", "))")}
try dbQueue.write { db in try db.execute(sql: """ INSERT INTO player (name, score) VALUES (?, ?); INSERT INTO player (name, score) VALUES (?, ?); """, arguments: ["Arthur", 750, "Barbara", 1000])}
When executing multiple statements, if any statement fails, the entire operation stops at that point. Consider using transactions for atomic operations.
SQL Interpolation provides safe value embedding with automatic escaping:
try dbQueue.write { db in let name = "O'Brien" // Contains single quote let score = 1000 let active = true try db.execute(literal: """ INSERT INTO player (name, score, active) VALUES (\(name), \(score), \(active)) """)}
try dbQueue.write { db in try db.execute(sql: """ UPDATE player SET score = score + 100 WHERE score < 1000 """) let updatedCount = db.changesCount print("Updated \(updatedCount) players")}
try dbQueue.write { db in try db.execute(sql: """ INSERT INTO player (id, name, score) VALUES (?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = excluded.name, score = excluded.score """, arguments: [1, "Arthur", 1500])}
try dbQueue.write { db in let statement = try db.makeStatement( sql: "INSERT INTO player (name, score) VALUES (?, ?)") for _ in 0..<1000 { try statement.execute(arguments: ["Player", 100]) }}
Wrap multiple updates in a transaction:
try dbQueue.write { db in try db.inTransaction { for i in 0..<1000 { try db.execute( sql: "INSERT INTO player (name) VALUES (?)", arguments: ["Player \(i)"]) } return .commit }}
Use batch operations when possible:
try dbQueue.write { db in // Delete multiple rows at once try db.execute( sql: "DELETE FROM player WHERE score < ?", arguments: [500])}