sqflite_migrate
Proper, and traditional way to do migrations in sqflite
- Supports using plain
sql
syntax to create migration files - A working CLI with all the necessary commands
- A programmatic approach for more fine grained control (not recommended for production)
Usage
dart pub global activate sqflitemigrate
This will give you access to global cli from pub.dev website
Create your migrations folder
Create migrations folder wherever you think its most suitable for your app, and fill it with migration files
-- UP --
CREATE TABLE IF NOT EXISTS my_table (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
-- DOWN --
DROP TABLE my_table;
-- UP --
and -- DOWN --
are just plain sql comments required to separate the up
and down
queries
You can write as many queries as you want in the up
and down
sections, as long as the statements are separated by ;
delimiter
-- UP --
CREATE TABLE IF NOT EXISTS my_table (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS my_table2 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
-- DOWN --
DROP TABLE my_table;
DROP TABLE my_table2;
Naming format
The migration files should be named in the following format
<version>_<description>.sql
Currently the version format is just a simple integer, that should be incremental, and sorted in ascending order that you want to run the migrations to run
In next releases we will add create
command in the cli, with options to create it with a timestamp, or a version number
Running the migrations
sqflite_migrate
cli has the following commands
migrate --database DB_PATH --path MIGRATIONS_FOLDER_PATH [OPTIONS]
- Runs the migrationsrollback --database DB_PATH --path MIGRATIONS_FOLDER_PATH [OPTIONS]
- Rolls back the migrationsstatus --database DB_PATH --path MIGRATIONS_FOLDER_PATH
- Shows the current status of the migrationsclear --database DB_PATH
- Clears all the records from migrations tabledelete-db --database DB_PATH
- Deletes the database file, and all the migrations records
Programmatic usage
You can also use the MigrationRunner
class to run the migrations programmatically, but it is not recommended to use it in production, as it is not properly tested for this approach
import 'package:sqflite_migrate/sqflite_migrate.dart';
void main() async {
final migrator = MigrationRunner.init(
database: 'path/to/db',
migrationsPath: 'path/to/migrations',
);
await migrator.migrate()..rollback();
}
Coming up
- Add
create
command in the cli - Add
timestamp
andversion
options in thecreate
command - Add
--force
option in themigrate
command to force run all the migrations - Add
--force
option in therollback
command to force rollback all the migrations