A type-safe, Swift-language layer over SQLite3.
SQLite.swift provides compile-time confidence in SQL statement syntax and intent.
- A pure-Swift interface
- A type-safe, optional-aware SQL expression builder
- A flexible, chainable, lazy-executing query layer
- Automatically-typed data access
- A lightweight, uncomplicated query and parameter binding interface
- Transactions with implicit commit/rollback
- Developer-friendly error handling and debugging
- Well-documented
- Extensively tested
import SQLite
let db = Database("path/to/db.sqlite3")
let users = db["users"]
let id = Expression<Int>("id")
let name = Expression<String?>("name")
let email = Expression<String>("email")
db.create(table: users) { t in
    t.column(id, primaryKey: true)
    t.column(name)
    t.column(email, unique: true)
}
// CREATE TABLE "users" (
//     "id" INTEGER PRIMARY KEY NOT NULL,
//     "name" TEXT,
//     "email" TEXT NOT NULL UNIQUE
// )
var alice: Query?
if let insertedID = users.insert(name <- "Alice", email <- "[email protected]") {
    println("inserted id: \(insertedID)")
    // inserted id: 1
    alice = users.filter(id == insertedID)
}
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]')
for user in users {
    println("id: \(user[id]), name: \(user[name]), email: \(user[email])"
    // id: 1, name: Optional("Alice"), email: [email protected]
}
// SELECT * FROM "users"
alice?.update(email <- replace(email, "mac.com", "me.com"))?
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com')
// WHERE ("id" = 1)
alice?.delete()?
// DELETE FROM "users" WHERE ("id" = 1)
users.count
// SELECT count(*) FROM "users"SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C API.
let stmt = db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["[email protected]", "[email protected]"] {
    stmt.run(email)
}
db.totalChanges // 3
db.lastChanges  // {Some 1}
db.lastID       // {Some 3}
for row in db.prepare("SELECT id, email FROM users") {
    println("id: \(row[0]), email: \(row[1])")
    // id: Optional(2), email: Optional("[email protected]")
    // id: Optional(3), email: Optional("[email protected]")
}
db.scalar("SELECT count(*) FROM users") // {Some 2}Read the documentation or explore more, interactively, from the Xcode project’s playground.
Note: SQLite.swift requires Swift 1.1 (and Xcode 6.1) or greater.
To install SQLite.swift:
- 
Drag the SQLite.xcodeproj file into your own project. (Submodule, clone, or download the project first.) 
- 
In your target’s Build Phases, add SQLite iOS (or SQLite Mac) to the Target Dependencies build phase. 
- 
Add the appropriate SQLite.framework product to the Link Binary With Libraries build phase. 
- 
Add the same SQLite.framework to a Copy Files build phase with a Frameworks destination. (Add a new build phase if need be.) 
- Found a bug or have a feature request? Open an issue.
- Want to contribute? Submit a pull request.
SQLite.swift is available under the MIT license. See the LICENSE file for more information.
Looking for something else? Try another Swift wrapper (or FMDB):

