/SQLiteMigrationManager.swift

Migration manager for SQLite.swift

Primary LanguageSwiftMIT LicenseMIT

SQLiteMigrationManager.swift

Build Version License Platform Carthage compatible

SQLiteMigrationManager.swift is a schema management system for SQLite.swift. It is heavily inspired by FMDBMigrationManager.

Concept

SQLiteMigrationManager.swift works by introducing a schema_migrations table into the database:

CREATE TABLE "schema_migrations" (
  "version" INTEGER NOT NULL UNIQUE
);

Each row in schema_migrations corresponds to a single migration that has been applied and represents a unique version of the schema. This schema supports any versioning scheme that is based on integers, but it is recommended that you utilize an integer that encodes a timestamp.

Usage

Have a look at the example project.

Creating the Migrations Table

let db = try Connection("path/to/store.sqlite")

let manager = SQLiteMigrationManager(db: self.db)

if !manager.hasMigrationsTable() {
  try manager.createMigrationsTable()
}

Creating a SQL File Migrations

Create a migration file in your migration bundle:

$ touch "`ruby -e "puts Time.now.strftime('%Y%m%d%H%M%S').to_i"`"_name.sql

SQLiteMigrationManager.swift will only recognize filenames of the form <version>_<name>.sql. The following filenames are valid:

  • 1.sql
  • 2_add_new_table.sql
  • 3_add-new-table.sql
  • 4_add new table.sql

Creating a Swift Migration

Swift based migrations can be implemented by conforming to the Migration protocol:

import Foundation
import SQLiteMigrationManager
import SQLite

struct SwiftMigration: Migration {
  var version: Int64 = 2016_01_19_13_12_06

  func migrateDatabase(_ db: Connection) throws {
    // perform the migration here
  }
}

Migrating a Database

let db = try Connection("path/to/store.sqlite")

let manager = SQLiteMigrationManager(db: self.db, migrations: [ SwiftMigration() ], bundle: NSBundle.mainBundle())

if manager.needsMigration() {
  try manager.migrateDatabase()
}

Inspecting the Schema State

let db = try Connection("path/to/store.sqlite")

let manager = SQLiteMigrationManager(db: self.db, migrations: [ SwiftMigration() ], bundle: NSBundle.mainBundle())

print("hasMigrationsTable() \(manager.hasMigrationsTable())")
print("currentVersion()     \(manager.currentVersion())")
print("originVersion()      \(manager.originVersion())")
print("appliedVersions()    \(manager.appliedVersions())")
print("pendingMigrations()  \(manager.pendingMigrations())")
print("needsMigration()     \(manager.needsMigration())")

Installation

Swift Package Manager

SQLiteMigrationManager.swift is available through Swift Package Manager. To install it, add the following dependency to your Package.swift file:

.package(url: "https://github.com/garriguv/SQLiteMigrationManager.swift.git", from: "0.8.2")

CocoaPods

SQLiteMigrationManager.swift is available through CocoaPods. To install it, add the following line to your Podfile:

pod "SQLiteMigrationManager.swift"

Carthage

SQLiteMigrationManager.swift is available through Carthage. To install it, add the following line to your Cartfile:

github "garriguv/SQLiteMigrationManager.swift"

Contributing

  1. Fork it ( https://github.com/garriguv/SQLiteMigrationManager.swift/fork )
  2. Install the development dependencies (bin/setup)
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Commit your changes (git commit -am 'Add some feature')
  5. Push to the branch (git push origin my-new-feature)
  6. Create a new Pull Request
  7. You're awesome! 👍

Author

Vincent Garrigues, vincent@garriguv.io

License

SQLiteMigrationManager.swift is available under the MIT license. See the LICENSE file for more info.