SQLiteMigrationManager.swift is a schema management system for SQLite.swift. It is heavily inspired by FMDBMigrationManager.
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.
Have a look at the example project.
let db = try Connection("path/to/store.sqlite")
let manager = SQLiteMigrationManager(db: self.db)
if !manager.hasMigrationsTable() {
try manager.createMigrationsTable()
}
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
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
}
}
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()
}
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())")
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")
SQLiteMigrationManager.swift is available through CocoaPods. To install
it, add the following line to your Podfile
:
pod "SQLiteMigrationManager.swift"
SQLiteMigrationManager.swift is available through Carthage. To install
it, add the following line to your Cartfile
:
github "garriguv/SQLiteMigrationManager.swift"
- Fork it ( https://github.com/garriguv/SQLiteMigrationManager.swift/fork )
- Install the development dependencies (
bin/setup
) - Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
- You're awesome! 👍
Vincent Garrigues, vincent@garriguv.io
SQLiteMigrationManager.swift is available under the MIT license. See the LICENSE file for more info.