Sequelize Créer Une Base De Données

y a-t-il un moyen de sequelize créer la base de données à laquelle j'essaie de me connecter si elle n'existe pas?

j'ai une instance MySQL brute et je récupère cette erreur:

ER_BAD_DB_ERROR: Unknown database 'mytest'

j'aimerais gérer cette erreur, utiliser les creds que j'ai fournis (ou un ensemble différent de creates avec les permissions de create), et lancer CREATE DATABASE mytest.

16
demandé sur Dave Briand 2015-07-08 16:43:05

2 réponses

j'ai peut-être une solution raisonnable. Je suis sûr qu'il pourrait être écrit plus proprement.

pour cet exemple J'utilise Postgres, la réponse serait légèrement différente pour MySQL. Je suis fortement emprunt de cette réponse: node-créer une base de données postgres

Dans la base de données.js j'ai le texte suivant 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 fonction init crée la base de données avant que sequelize ne soit appelée. Il ouvre d'abord une connexion à postgres et crée la base de données. Si la base de données existe déjà, une erreur sera levée que nous ignorons. Une fois créé, nous initialisons sequelize et l'envoyons au callback. Fait important, si la base de données existe déjà, elle ne sera pas écrasée.

en app.js je reçois l'instance de la base de données et je l'envoie au module qui en a besoin, dans ce cas c'est passeport.

require('./server/config/database.js').init(function(database) {
  require('./server/config/passport.js')(passport, database);
});
20
répondu Spencer 2017-05-23 10:31:09

dans mon cas, j'utilisais sqlite, mais l'idée était la même. J'avais besoin de créer la première base de données avec 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',
  ...
});
2
répondu Grant 2017-04-22 07:25:04