2014-11-26 1 views
9

У меня есть веб-приложения Express.js, которые используют Knex.js в качестве построителя запросов SQL и механизма миграции. Хотя у Knex.js есть методы для создания, удаления и изменения таблиц, у него нет методов для создания/удаления самой базы данных.Задача создания/удаления базы данных для gulp/knex

Мне было интересно, есть ли расширение для Knex.js или даже задача gulp, которая позволяет вам создавать/удалять базу данных. Я не мог найти. Я использую базу данных PostgreSQL.

ответ

15

Я не уверен, PostgreSQL, но я попал в такую ​​же проблему с MySQL. Я обнаружил, что вы можете использовать knex для соединения без выбора базы данных, создания базы данных с необработанным SQL, а затем повторно подключиться к выбору новой базы данных.

Вот автономный скрипт, который создает новую базу данных с таблицей одноколоночной:

var conn = { 
 
    host  : '127.0.0.1', 
 
    user  : 'user', 
 
    password : 'pass', 
 
    charset : 'utf8' 
 
}; 
 

 
// connect without database selected 
 
var knex = require('knex')({ client: 'mysql', connection: conn}); 
 

 
knex.raw('CREATE DATABASE my_database') 
 
    .then(function(){ 
 
    knex.destroy(); 
 
    
 
    // connect with database selected 
 
    conn.database = 'my_database'; 
 
    knex = require('knex')({ client: 'mysql', connection: conn}); 
 

 
    knex.schema.createTable('my_table', function (table) { 
 
     table.string('my_field'); 
 
    }) 
 
    .then(function() { 
 
     knex.destroy(); 
 
    }); 
 
    });

Это работает (достаточно хорошо для меня сейчас), но я интересно узнать о других решениях.

+0

Похоже на интересное направление. Будет проверять его на PostgreSQL. – ifeins

+7

Для postgresql он попросит базу данных по умолчанию, вы можете просто использовать postgres в качестве базы данных по умолчанию. –

2

Вы можете добавить https://www.npmjs.org/package/gulp-shell

Это должно работать:

var gulp = require('gulp') 
 
var shell = require('gulp-shell') 
 

 
gulp.task('example', function() { 
 
    return gulp.src('*.js', {read: false}) 
 
    .pipe(shell([ 
 
     'psql DROP DATABASE dbname;', 
 
     'psql CREATE DATABASE dbname;' 
 
    ], { 
 
     templateData: { 
 
     f: function (s) { 
 
      return s.replace(/$/, '.bak') 
 
     } 
 
     } 
 
    })) 
 
})

+1

Это будет работать, но я ищу решение, не отбрасывая его в оболочку. Наверное, это возможно сделать с помощью пакета pg npm. Жаль, что knex не поддерживает команды CREATE/DROP DATABASE. – ifeins

2
var knex = require('knex')({ 
    client: 'pg', 
    connection: { 
    host: HOST, 
    user: USERNAME, 
    password: PASSWORD, 
    database: 'postgres', 
    charset: 'utf8' 
    } 
}); 

knex.raw('CREATE DATABASE DB_NAME;') 
    .then(function() { 
    return knex.raw('DROP DATABASE DB_NAME;') 
    }) 
    .finally(function() { 
    console.log("Done"); 
    }); 
Смежные вопросы