【问题标题】:create/drop database task for gulp/knex为 gulp/knex 创建/删除数据库任务
【发布时间】:2015-01-25 01:51:00
【问题描述】:

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

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

【问题讨论】:

  • 您不能使用数据库驱动程序吗?例如,我使用的是 mssql,npm mssql 包无论如何都是一个依赖项,所以只需在将 knex 连接到它之前使用它来创建数据库?

标签: database express migration gulp knex.js


【解决方案1】:

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

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

【讨论】:

  • 似乎是一个有趣的方向。将检查它的 PostgreSQL。
  • 对于 postgresql 它会要求一个默认数据库,你可以使用 postgres 作为默认数据库。
  • @nick,对我来说也足够了。
【解决方案2】:
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");
  });

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这行得通,但我正在寻找一种解决方案,而不是掉入外壳。我想可能可以使用“pg”npm 包。可惜 knex 不支持 CREATE/DROP DATABASE 命令。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      松散相关(不是 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);
        });
      }
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-02
          • 2018-09-16
          • 2016-05-04
          • 1970-01-01
          • 2018-11-25
          • 1970-01-01
          相关资源
          最近更新 更多