存在しない場合に接続しようとしているデータベースを続編で作成する方法はありますか?
生のMySQLインスタンスがあり、このエラーが返されます。
ER_BAD_DB_ERROR: Unknown database 'mytest'
そのエラーを処理し、提供した資格情報(または作成権限を持つ別の作成セット)を使用して、CREATE DATABASE mytestを実行します。
合理的な解決策があるかもしれません。しかし、もっときれいに書くことができると確信しています。
この例では、Postgresを使用していますが、MySQLの答えは少し異なります。私はこの答えから大きく借りています: node-postgres create database
Database.jsでは、次の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
});
});
};
Init関数は、sequelizeが呼び出される前にデータベースを作成しています。最初にpostgresへの接続を開き、データベースを作成します。データベースがすでに存在する場合、無視しているエラーがスローされます。作成したら、sequelizeを初期化し、コールバックに送信します。重要なのは、データベースが既に存在する場合、上書きされないことです。
App.jsでは、データベースインスタンスを受け取り、それを必要とするモジュール(この場合はパスポート)に送信します。
require('./server/config/database.js').init(function(database) {
require('./server/config/passport.js')(passport, database);
});
私の場合、sqliteを使用していましたが、考え方は同じでした。最初に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',
...
});
最終的にmysql2
パッケージ、これが私がやったことです。
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
})
})
その後、sequelize
を使用してそのデータベースに接続できます。
Postgresqlではこの問題はありませんでしたが、mysqlでは問題がありました。解決策はpre-migrate
スクリプトを作成し、後続の移行の前にそれをトリガーすることでした。これは私のpackage.json
の一部です。
"db:pre-migrate": "node scripts/createDB.js",
"db:migrate": "npm run db:pre-migrate && node_modules/.bin/sequelize db:migrate",
ここでいくつかの回答で提案されたものと同様に、createDB.js
やmysql
(または生のクエリでmysqlに接続する他のモジュール)のようなモジュールを使用して、このnode-postgres
を作成できます。
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);
})
})