Product
Introducing License Enforcement in Socket
Ensure open-source compliance with Socket’s License Enforcement Beta. Set up your License Policy and secure your software!
db-migrate
Advanced tools
Database migration framework for node.js
$ npm install -g db-migrate
Usage: db-migrate [up|down|create] migrationName [options]
Options:
--env, -e The environment to run the migrations under. [default: "dev"]
--migrations-dir, -m The directory containing your migration files. [default: "./migrations"]
--count, -c Max number of migrations to run.
--verbose, -v Verbose mode. [default: false]
--config Location of the database.json file. [default: "./database.json"]
To create a migration, execute db-migrate create
with a title. node-db-migrate
will create a node module within ./migrations/
which contains the following two exports:
exports.up = function(db, callback){
callback();
};
exports.down = function(callback){
callback();
};
All you have to do is populate these, invoking callback()
when complete, and you are ready to migrate!
For example:
$ db-migrate create add-pets
$ db-migrate create add-owners
The first call creates ./migrations/20111219120000-add-pets.js
, which we can populate:
exports.up = function(db, callback){
db.createTable('pets', {
id: { type: 'int', primaryKey: true },
name: 'string'
}, callback);
};
exports.down = function(db, callback){
db.dropTable('pets', callback);
};
The second creates ./migrations/20111219120005-add-owners.js
, which we can populate:
exports.up = function(db, callback){
db.createTable('owners', {
id: { type: 'int', primaryKey: true },
name: 'string'
}, callback);
};
exports.down = function(db, callback){
db.dropTable('owners', callback);
};
Executing multiple statements against the database within a single migration requires a bit more care. You can either nest the migrations like:
exports.up = function(db, callback){
db.createTable('pets', {
id: { type: 'int', primaryKey: true },
name: 'string'
}, createOwners);
function createOwners(err) {
if (err) { callback(err); return; }
db.createTable('owners', {
id: { type: 'int', primaryKey: true },
name: 'string'
}, callback);
}
};
exports.down = function(db, callback){
db.dropTable('pets', function(err) {
if (err) { callback(err); return; }
db.dropTable('owners', callback);
})
};
or use the async library to simplify things a bit, such as:
var async = require('async');
exports.up = function(db, callback){
async.series([
db.createTable.bind(db, 'pets', {
id: { type: 'int', primaryKey: true },
name: 'string'
}),
db.createTable.bind(db, 'owners', {
id: { type: 'int', primaryKey: true },
name: 'string'
})
], callback);
};
exports.down = function(db, callback){
async.series([
db.dropTable.bind(db, 'pets'),
db.dropTable.bind(db, 'owners')
], callback);
};
When first running the migrations, all will be executed in sequence. A table named migrations
will also be created in your database to track which migrations have been applied.
$ db-migrate up
[INFO] Processed migration 20111219120000-add-pets
[INFO] Processed migration 20111219120005-add-owners
[INFO] Done
Subsequent attempts to run these migrations will result in the following output
$ db-migrate up
[INFO] No migrations to run
[INFO] Done
If we were to create another migration using db-migrate create
, and then execute migrations again, we would execute only those not previously executed:
$ db-migrate up
[INFO] Processed migration 20111220120210-add-kennels
[INFO] Done
You can also run migrations incrementally by specifying a date substring. The example below will run all migrations created on or before December 19, 2011:
$ db-migrate up 20111219
[INFO] Processed migration 20111219120000-add-pets
[INFO] Processed migration 20111219120005-add-owners
[INFO] Done
You can also run a specific number of migrations with the -c option:
$ db-migrate up -c 1
[INFO] Processed migration 20111219120000-add-pets
[INFO] Done
All of the down migrations work identically to the up migrations by substituting the word down
for up
.
db-migrate supports the concept of environments. For example, you might have a dev, test, and prod environment where you need to run the migrations at different times. Environment settings are loaded from a database.json file like the one shown below:
{
"dev": {
"driver": "sqlite3",
"filename": "~/dev.db"
},
"test": {
"driver": "sqlite3",
"filename": ":memory:"
},
"prod": {
"driver": "mysql",
"user": "root",
"password": "root"
},
"pg": {
"driver": "pg",
"user": "test",
"password": "test",
"host": "localhost",
"database": "mydb"
}
}
You can pass the -e or --env option to db-migrate to select the environment you want to run migrations against. The --config option can be used to specify the path to your database.json file if it's not in the current working directory.
db-migrate up --config config/database.json -e prod
The above will run all migrations that haven't yet been run in the prod environment, grabbing the settings from config/database.json.
Below are examples of all the different migrations supported by db-migrate. Please note that not all migrations are supported by all databases. For example, SQLite does not support dropping columns.
Creates a new table with the specified columns.
Arguments
Examples
// with no table options
exports.up = function(db, callback) {
db.createTable('pets', {
id: { type: 'int', primaryKey: true, autoIncrement: true },
name: 'string' // shorthand notation
}, callback);
}
// with table options
exports.up = function(db, callback) {
db.createTable('pets', {
columns: {
id: { type: 'int', primaryKey: true, autoIncrement: true },
name: 'string' // shorthand notation
},
ifNotExists: true
}, callback);
}
Column Specs
The following options are available on column specs
primaryKey
option to true on multiple columnsDrop a database table
Arguments
Table Options
Rename a database table
Arguments
Add a column to a database table
Arguments
Column spec is the same as that described in createTable
Remove a column from an existing database table
Rename a column
Arguments
Change the definition of a column
Arguments
Add an index
Arguments
Insert an item into a given column
Arguments
Remove an index
Arguments
Run arbitrary SQL
Arguments
Execute a select statement
Arguments
(The MIT License)
Copyright (c) 2011 Near Infinity Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
FAQs
Database migration framework for node.js
The npm package db-migrate receives a total of 60,780 weekly downloads. As such, db-migrate popularity was classified as popular.
We found that db-migrate demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Ensure open-source compliance with Socket’s License Enforcement Beta. Set up your License Policy and secure your software!
Product
We're launching a new set of license analysis and compliance features for analyzing, managing, and complying with licenses across a range of supported languages and ecosystems.
Product
We're excited to introduce Socket Optimize, a powerful CLI command to secure open source dependencies with tested, optimized package overrides.