2015-07-08 17 views
12

C'è un modo per fare in sequenza creare il database a cui sto cercando di connettermi se non esiste?Sequenza Crea Database

ho un'istanza di MySQL crudo e ottengo questo errore di nuovo:

ER_BAD_DB_ERROR: Unknown database 'mytest' 

mi piacerebbe per gestire questo errore, utilizzare i creds ho fornito (o un diverso insieme di crea con CREATE permessi), ed esegui CREATE DATABASE mytest.

+5

Non credo che questa funzione esista in sequelize, ma anch'io vorrei una funzionalità come questa. Niente è più fastidioso che iniziare su un progetto esistente e aver bisogno di configurare un database prima ancora di poter eseguire l'app. Non voglio mettere i miei colleghi in nessuna configurazione. Scarica e vai è la strada da percorrere. – Spencer

risposta

17

Posso avere una soluzione ragionevole. Sono sicuro che potrebbe essere scritto in modo più pulito però.

Per questo esempio sto utilizzando Postgres, la risposta sarebbe leggermente diversa per MySQL. Sto pesantemente prestito da questa risposta: node-postgres create database

In database.js ho la funzione init

var Sequelize = require('sequelize'), 
    pg = require('pg'); 

module.exports.init = function(callback) { 
    var dbName = 'db_name', 
     username = 'postgres', 
     password = 'password', 
     host = 'localhost' 

    var conStringPri = 'postgres://' + username + ':' + password + '@' + host + '/postgres'; 
    var conStringPost = 'postgres://' + username + ':' + password + '@' + host + '/' + dbName; 

    // connect to postgres db 
    pg.connect(conStringPri, function(err, client, done) { 
     // create the db and ignore any errors, for example if it already exists. 
     client.query('CREATE DATABASE ' + dbName, function(err) { 
      //db should exist now, initialize Sequelize 
      var sequelize = new Sequelize(conStringPost); 
      callback(sequelize); 
      client.end(); // close the connection 
     }); 
    }); 
}; 

La funzione init sta creando il database prima sequelize si chiama seguente. Prima apre una connessione a postgres e crea il database. Se il database esiste già, verrà generato un errore che stiamo ignorando. Una volta creato, inizializziamo sequelize e lo inviamo al callback. È importante sottolineare che, se il database esiste già, non verrà sovrascritto.

In app.js Ricevo l'istanza del database e la invio a qualsiasi modulo ne abbia bisogno, in questo caso è passaporto.

require('./server/config/database.js').init(function(database) { 
    require('./server/config/passport.js')(passport, database); 
}); 
+0

Buon pensiero per l'esame di node-pg. Controllerò node-mysql e vedrò se esiste qualcosa di simile. Tornerà e segnerà risposta se funziona. –

+0

Dici "Se il database esiste già, verrà generato un errore che stiamo ignorando". Questo significa che se il database esiste già, verrà sovrascritto? O che sarà appena trovato e usato? –

+0

@steven_noble No, se il DB esiste già allora CREATE DATABASE genera un errore che lo dice. Non sovrascriverà un database esistente. È possibile verificare questo con un nome DB fittizio e disconnettere l'errore per vedere cosa dice e fa. – Spencer

1

Nel mio caso stavo usando sqlite, ma l'idea era la stessa. Avevo bisogno di creare il database prima con sqlite3.

const sqlite = require('sqlite3'); 
const db = new sqlite.Database('/path/to/database.sqlite'); 
const sequelize = new Sequelize('database', '', '', { 
    dialect: 'sqlite', 
    storage: '/path/to/database.sqlite', 
    ... 
}); 
Problemi correlati