web-dev-qa-db-ja.com

gulp / knexのデータベースタスクの作成/削除

SQLクエリビルダーおよび移行エンジンとしてKnex.jsを使用するExpress.jsWebアプリケーションがあります。 Knex.jsにはテーブルを作成、削除、変更するためのメソッドがありますが、データベース自体を作成/削除するためのメソッドはありません。

Knex.jsの拡張機能や、データベースの作成/削除を可能にするgulpタスクがあるかどうか疑問に思いました。何も見つかりませんでした。 PostgreSQLデータベースを使用しています。

14
ifeins

PostgreSQLについてはよくわかりませんが、MySQLでも同じ問題が発生します。 knexを使用して、データベースを選択せず​​に接続し、生のSQLでデータベースを作成してから、新しいデータベースを選択して再接続できることを発見しました。

これは、単一列のテーブルで新しいデータベースを作成するスタンドアロンスクリプトです。

var conn = {
  Host     : '127.0.0.1',
  user     : 'user',
  password : 'pass',
  charset  : 'utf8'
};

// connect without database selected
var knex = require('knex')({ client: 'mysql', connection: conn});

knex.raw('CREATE DATABASE my_database')
  .then(function(){
    knex.destroy();
    
    // connect with database selected
    conn.database = 'my_database';
    knex = require('knex')({ client: 'mysql', connection: conn});

    knex.schema.createTable('my_table', function (table) {
      table.string('my_field');
    })
    .then(function() {
      knex.destroy();
    });
  });

これは機能しますが(今のところ私には十分です)、他の解決策について聞いてみたいです。

25
nick
var knex = require('knex')({
  client: 'pg',
  connection: {
    Host: Host,
    user: USERNAME,
    password: PASSWORD,
    database: 'postgres',
    charset: 'utf8'
  }
});

knex.raw('CREATE DATABASE DB_NAME;')
  .then(function() {
    return knex.raw('DROP DATABASE DB_NAME;')
  })
  .finally(function () {
    console.log("Done");
  });
5
siyang

追加できます https://www.npmjs.org/package/gulp-Shell

これは機能するはずです:

var gulp  = require('gulp')
var Shell = require('gulp-Shell')

gulp.task('example', function () {
  return gulp.src('*.js', {read: false})
    .pipe(Shell([
      'psql DROP DATABASE dbname;',
      'psql CREATE DATABASE dbname;'
    ], {
      templateData: {
        f: function (s) {
          return s.replace(/$/, '.bak')
        }
      }
    }))
})
2
Josh Lankford

Postgresは、アプリケーションの接続文字列を受け入れて、アプリケーションデータベースを作成します。

環境/開発

DATABASE_URL=postgres://user:password@localhost:5432/sample_development

package.json

"scripts": {
  "db:create:development": "env-cmd env/development psql ${DATABASE_URL} -c 'CREATE DATABASE sample_test'",
  "db:create:test": "env-cmd env/test psql ${DATABASE_URL} -c 'CREATE DATABASE sample_test'"
}

次に、npm run-script db:create:developmentを実行します。

(これはenv-cmdパッケージを使用しますが、必須ではありません。)

0
mmell