web-dev-qa-db-ja.com

データベース作成の続編

存在しない場合に接続しようとしているデータベースを続編で作成する方法はありますか?

生のMySQLインスタンスがあり、このエラーが返されます。

ER_BAD_DB_ERROR: Unknown database 'mytest'

そのエラーを処理し、提供した資格情報(または作成権限を持つ別の作成セット)を使用して、CREATE DATABASE mytestを実行します。

22
Dave Briand

合理的な解決策があるかもしれません。しかし、もっときれいに書くことができると確信しています。

この例では、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);
});
20
Spencer

私の場合、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',
  ...
});
4
Grant

最終的に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を使用してそのデータベースに接続できます。

3
nikksan

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.jsmysql(または生のクエリで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);
    })
})
1
Marco Barcellos