2014-11-26 6 views
9

Possiedo un'applicazione web Express.js che utilizza Knex.js come motore di sviluppo query SQL e di migrazione. Mentre Knex.js ha metodi per creare, rilasciare e modificare tabelle, non ha metodi per creare/rilasciare il database stesso.attività di creazione/rilascio del database per gulp/knex

Mi chiedevo se esiste un'estensione per Knex.js o anche un'attività di gulp che consente di creare/eliminare un database. Non sono riuscito a trovarne. Sto usando un database PostgreSQL.

risposta

15

io non sono sicuro di PostgreSQL, ma mi ha colpito lo stesso problema con MySQL. Ho scoperto che puoi usare knex per connetterti senza selezionare un database, creare il database con SQL raw, quindi riconnetterti selezionando il nuovo database.

Ecco uno script stand-alone che crea un nuovo database con una tabella sola colonna:

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(); 
 
    }); 
 
    });

Questo funziona (abbastanza bene per me per ora), ma io sono interessato a conoscere altre soluzioni.

+0

Sembra una direzione interessante. Controllerà per PostgreSQL. – ifeins

+7

Per postgresql verrà richiesto un database predefinito, è possibile utilizzare solo Postgres come database predefinito. –

2

È possibile aggiungere https://www.npmjs.org/package/gulp-shell

questo dovrebbe funzionare:

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

Questo funzionerebbe, ma sto cercando una soluzione senza passare alla shell. Immagino che sia probabilmente possibile fare usando il pacchetto "pg" di npm. Peccato che knex non supporti i comandi 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"); 
    });