为gulp / knex创建/删除数据库任务

时间:2014-11-26 16:26:24

标签: database express migration gulp knex.js

我有一个Express.js Web应用程序,它使用Knex.js作为SQL查询构建器和迁移引擎。 虽然Knex.js具有创建,删除和更改表的方法,但它没有创建/删除数据库本身的方法。

我想知道Knex.js是否有扩展,甚至是允许您创建/删除数据库的gulp任务。我找不到任何东西。 我正在使用PostgreSQL数据库。

6 个答案:

答案 0 :(得分:22)

我不确定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();
    });
  });

这有效(对我来说已经足够了)但我很想知道其他解决方案。

答案 1 :(得分:4)

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");
  });

答案 2 :(得分:2)

您可以添加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')
        }
      }
    }))
})

答案 3 :(得分:0)

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包,但这不是必需的。)

答案 4 :(得分:0)

松散相关(不是 Gulp 问题),但这是我在 Knex 应用程序中创建数据库的解决方案。我只是忽略错误,而不是与 knexfileseed 集成,所以不会经常被调用,而是从 package.json 调用它。 dropdbcreatedb 可执行文件随 Postgres 提供:

// $ yarn node ./lib/createdb.mjs
import { exec } from 'child_process';

if (process.env.NODE_ENV === 'development') {
  exec(`createdb ${dbName} --template=template0`, (error, stdout, stderr) => {
    if (!error) return console.log(`"${dbName}" database created!`);
    return console.error('createdb stderr:', stderr);
  });
}

答案 5 :(得分:0)

knex-db-manager 是一个可以做到这一点的插件包。