@synconset/knex-cleaner
Version:
Database cleaner for Knex.js and bookshelf.js
92 lines (80 loc) • 2.7 kB
JavaScript
;
var BPromise = require('bluebird');
var _ = require('lodash');
var knexTables = require('../lib/knex_tables');
var DefaultOptions = {
mode: 'truncate', // Can be ['truncate', 'delete']
ignoreTables: [] // List of tables to not delete
};
function clean(knex, passedInOptions) {
var options = _.defaults({}, passedInOptions, DefaultOptions);
return knexTables.getTableNames(knex, options)
.then(function(tables) {
if (options.mode === 'delete') {
return cleanTablesWithDeletion(knex, tables, options);
} else if (options.mode === 'drop') {
return dropTables(knex, tables, options);
} else {
return cleanTablesWithTruncate(knex, tables, options);
}
});
}
function dropTables(knex, tableNames, options) {
var client = knex.client.dialect;
switch(client) {
case 'mysql':
return knex.transaction(function(trx) {
knex.raw('SET FOREIGN_KEY_CHECKS=0').transacting(trx)
.then(function() {
return BPromise.map(tableNames, function(tableName) {
return knex.schema.dropTable(tableName).transacting(trx);
});
})
.then(function() {
return knex.raw('SET FOREIGN_KEY_CHECKS=1').transacting(trx);
})
.then(trx.commit);
});
default:
throw new Error('Could not get the sql to select table names from client: ' + client);
}
}
function cleanTablesWithDeletion(knex, tableNames, options) {
return BPromise.map(tableNames, function(tableName) {
return knex.select().from(tableName).del();
});
}
function cleanTablesWithTruncate(knex, tableNames, options) {
var client = knex.client.dialect;
switch(client) {
case 'mysql':
return knex.transaction(function(trx) {
knex.raw('SET FOREIGN_KEY_CHECKS=0').transacting(trx)
.then(function() {
return BPromise.map(tableNames, function(tableName) {
return knex(tableName).truncate().transacting(trx);
});
})
.then(function() {
return knex.raw('SET FOREIGN_KEY_CHECKS=1').transacting(trx);
})
.then(trx.commit);
});
case 'postgresql':
var quotedTableNames = tableNames.map(function(tableName) {
return '\"' + tableName + '\"';
});
return knex.raw('TRUNCATE ' + quotedTableNames.join() + ' CASCADE');
case 'sqlite3':
return BPromise.map(tableNames, function(tableName) {
return knex(tableName).truncate();
});
default:
throw new Error('Could not get the sql to select table names from client: ' + client);
}
}
module.exports = {
clean: function(knex, options) {
return clean(knex, options);
}
};