sardine v0.6.4
Sardine
A simple database agnostic migration tool.
Supports:
- Postgres
- Sqlite3
Installation
Install the driver for your project
$ npm install sqlite3 --saveor
$ npm install pg --saveIf you want to use the cli tool
$ npm install sardine -gIf you want to use Sardine's API.
$ npm install sardine --saveGetting started
Initialize a new sardine project
$ sardine initEdit the configuration to match you database connection settings. Then create a new migration
$ sardine create v1Create a new step
$ sardine step v1 fooThis creates ./up/01_foo.sql and ./down/01_foo.sql. Edit them with your sql.
-- 20151015_105530_v1/up/01_foo.sql
CREATE TABLE foo1
(
id serial NOT NULL,
CONSTRAINT foo1_pkey PRIMARY KEY (id)
);
-- 20151015_105530_v1/down/01_foo.sql
DROP TABLE foo1;Apply it
$ sardine upThen revert it
$ sardine rollbackHow does it work?
Sardine will:
- Look in your migration directory
- Read every files in the
upanddowndirectory - Apply each file by alphabetical order in each migration directory for a given direction
- Prevent you from running a migration if it has changed. Unless it's the latest one.
- Ensure you have a
upand adownstep with matching names
Sardine will not:
- Check the consistency of your sql steps, it's your job to make sure a
downstep is the strict opposite of theupone
Usage
Usage: sardine [options] [command]
Commands:
init Initialize a new Sardine project
compile [options] <suffix> Merge up and down steps to single files
create <suffix> Create a new migration directory
step <migration> [suffixes...] Create (a) new step(s) in <migration>. Fuzzy searchs migrations by name.
update|up Migrate to the database to the latest version
rollback|down [options] Revert latest migration. --all to revert all migrations
current|cur Show current migration
Options:
-h, --help output usage information
-V, --version output the version number
-v, --verbose Display verbose information
-c, --config [path] Specify configuration file pathAPI
Note: Every method in the API returns a bluebird Promise.
config
Sardine looks up for a sardineConfig.js file in the current directory.
You can override this behavior by passing a path the --config CLI option.
{
directory: 'migrations', // Directory in which the migrations will be located
tableName: 'sardine_migrations', // Name of Sardine's meta table
driver: 'pg', // Driver name, can be pg or sqlite3
connection: {
host: 'localhost',
user: 'postgres',
password: '',
database: 'postgres',
},
path: '/usr/local/mybase.sqlite', // Only used for sqlite3
preprocess: (content, path) => content, // Optional SQL preprocessing function.
// Takes content and path of a SQL file.
// Returns the actual SQL code to be executed.
// Default: identity function.
};migration
A migration Object looks something this.
{
name: '20151209_010320_foobar',
up: {
files: [
{
filename: '01_foo.sql',
contents: 'CREATE TABLE foo1()',
checksum: ''
},
{
filename: '02_foo.sql',
contents: 'CREATE TABLE foo2()',
checksum: ''
},
],
checksum: checksum(files)
},
down: {
files: [
{
filename: '01_foo.sql',
contents: 'DROP TABLE foo1',
checksum: ''
},
{
filename: '02_foo.sql',
contents: 'DROP TABLE foo2',
checksum: ''
},
],
checksum: checksum(files)
},
steps: 2,
checksum: checksum(upSum, downSum),
};new Sardine(config)
Creates a new Sardine instance with config.
const sardine = new Sardine(config);.create(date, suffix)
Creates a sardine migration directory using date and suffix
const sardine = new Sardine(config);
const date = new Date(2015, 11, 9, 1, 3, 20);
const suffix = 'foobar';
sardine.create(date, suffix);
// Creates 20151209_010320_foobar/up
// Creates 20151209_010320_foobar/down.step(migrationName, suffix1, ...)
Fuzzy searches for a directory name migrationName and suffix step file in both up and down
const sardine = new Sardine(config);
sardine.step('foobar', ['foo', 'bar']);
// Creates 20151209_010320_foobar/up/01_foo.sql
// Creates 20151209_010320_foobar/up/02_bar.sql
// Creates 20151209_010320_foobar/down/01_foo.sql
// Creates 20151209_010320_foobar/down/02_bar.sql.current(options)
Returns the list of discovered migrations and applies options.default or options.current on each
line depending on which migration is currently applied. The initial state output is defined by options.initial.
Example:
Given that we have three migrations, foo, bar, baz, but not is applied then:
sardine.current({
initial: (n) => `${_.capitalize(n)} state`,
default: (n) => `default ${n}`,
current: (n) => `That's the current one: ${n}`,
});would yield:
[
'That\'s the current one: Initial state',
'default 20151015_105530_foo',
'default 20151015_105534_bar',
'default 20151021_134514_baz'
]After calling sardine.up(), the same call would yield:
[
'default Initial state',
'default 20151015_105530_foo',
'default 20151015_105534_bar',
'That\'s the current one: 20151021_134514_baz'
]const sardine = new Sardine(config);
sardine.step('foobar', ['foo', 'bar']);
// Creates 20151209_010320_foobar/up/01_foo.sql
// Creates 20151209_010320_foobar/up/02_bar.sql
// Creates 20151209_010320_foobar/down/01_foo.sql
// Creates 20151209_010320_foobar/down/02_bar.sql.up()
Applies all migrations
const sardine = new Sardine(config);
sardine.up();.down(all)
Rollbacks the latest migration, rollbacks everything if all is true.
const sardine = new Sardine(config);
sardine.down();.compile(migrationName)
Tries to find migrationName, then gathers every files in up and down and merge each of them in a single string.
const sardine = new Sardine(config);
sardine.compile('foobar');
// { files: { up: 'CREATE TABLE foo();', down: 'DROP TABLE foo;' }, migration: { name: 'foobar', ... } }events
The default event handlers (used in the CLI) can be found in
require('sardine/events').handlers;
initNoop
Fired when Sardine#init() was called but a sardineConfig.js file already exist in the current working directory.
initSuccess
Fired when Sardine#init() was called and a sardineConfig.js file was created in the current working directory.
createdMigrationDirectory(dir)
Fired when Sardine#create() was called and a new migration directory dir was created.
createdDirectionDirectory(dir)
When Sardine#create() is called, this event is fired when dir/up and dir/down are created.
stepFileCreated(file)
When Sardine#step(migrationName, [suffix1][, suffix2][, ...]) was called, for each suffix this event is fired twice. Once for the update, and once for the rollback file.
applyBatch(batch, direction)
Fired when Sardine#up() or Sardine#down() is called.
batchis a list ofmigrationobjects.directionis either "up" or "down".
applyMigration(migration, direction)
Fired when Sardine#up or Sardine#down() is called.
migrationismigrationobject.directionis either "up" or "down".
stepApplied(file)
Fired each time a sql file is executed.
Code quality
To run tests:
$ npm testTo lint the code:
$ npm run lintLicense
MIT
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago