Existe-t-il un moyen de créer la base de données à laquelle je tente de me connecter si elle n'existe pas?
J'ai une instance brute de MySQL et j'obtiens cette erreur:
ER_BAD_DB_ERROR: Unknown database 'mytest'
Je voudrais gérer cette erreur, utiliser les creds que j'ai fournis (ou un ensemble différent de crée avec des autorisations de création) et exécutez CREATE DATABASE mytest.
J'ai peut-être une solution raisonnable. Je suis sûr que cela pourrait être écrit plus proprement cependant.
Pour cet exemple, j'utilise Postgres, la réponse serait légèrement différente pour MySQL. J'emprunte beaucoup à cette réponse: node-postgres create database
Dans database.js, j'ai la fonction init suivante
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 l'appel de seize. 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 ignorée. Une fois créé, nous initialisons Sequelize et l'envoyons au rappel. Fait important, si la base de données existe déjà, elle ne sera pas écrasée.
Dans app.js, je reçois l'instance de base de données et l'envoie au module qui en a besoin, dans ce cas il s'agit d'un passeport.
require('./server/config/database.js').init(function(database) {
require('./server/config/passport.js')(passport, database);
});
Dans mon cas, j'utilisais sqlite, mais l'idée était la même. Je devais d'abord créer la 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',
...
});
J'ai fini par utiliser le package mysql2
, voici ce que j'ai fait.
const mysql = require('mysql2/promise');
mysql.createConnection({
user : config.sequelize.username,
password : config.sequelize.password
}).then(() => {
connection.query('CREATE DATABASE IF NOT EXISTS myRandomDb;').then(() => {
// Safe to use sequelize now
})
})
Après cela, je peux me connecter à cette base de données en utilisant sequelize
.
Je n'avais pas ce problème avec Postgresql, mais avec mysql . La solution consistait à créer un script pre-migrate
et à le déclencher avant la migration consécutive, voici une partie de mon package.json
:
"db:pre-migrate": "node scripts/createDB.js",
"db:migrate": "npm run db:pre-migrate && node_modules/.bin/sequelize db:migrate",
et de manière similaire à ce qui était proposé dans certaines réponses ici, vous pouvez créer ce createDB.js
en utilisant des modules tels que node-postgres
ou mysql
(ou tout autre qui se connecte à mysql avec des requêtes brutes):
const mysql = require('mysql2/promise');
const dbName = process.env.DB_SCHEMAS || "YOUR_DB";
mysql.createConnection({
Host: process.env.DB_Host || "127.0.0.1",
port: process.env.DB_PORT || "3306",
user : process.env.DB_USER || "root",
password : process.env.DB_PASSWORD || "root",
}).then( connection => {
connection.query(`CREATE DATABASE IF NOT EXISTS ${dbName};`).then((res) => {
console.info("Database create or successfully checked");
process.exit(0);
})
})