sql - 在 Knex 迁移中创建数据库

标签 sql postgresql migration knex.js

我认为从第一个数据库交互开始使用迁移是个好主意,所以我想为数据库创建创建一个迁移。

knex文件.js

'use strict';

require('dotenv').config({ path: 'process.env' });

const config =  {
  client: 'pg',
  connection: {
    host: process.env.DB_URL,
  },
};


module.exports = config;

迁移文件:

'use strict';

exports.up = function(knex, Promise) {
  return knex.raw('CREATE DATABASE asd');
};

exports.down = function(knex, Promise) {
  return knex.raw('DROP DATABASE asd');
};

exports.config = {
  transaction: false
};

到目前为止它工作正常,但是当我将 database 添加到 knexfile 配置时,它无法迁移,因为 Knex 尝试连接到不存在的数据库。

我还尝试使用一个新的 Knex 实例来完成这个单一迁移,例如:

exports.up = function(_, Promise) {
  // Remove database from config so Knex won't try to connect
  // to a non existing database.
  const config = require(process.cwd() + '/knexfile');
  config.connection.database = null;
  const knex = require('knex')(config);

  return knex.raw('CREATE DATABASE asd');
};

但是knex在迁移之前已经初始化,所以失败并出现同样的错误:

error: database "asd" does not exist

关于如何从 Knex 迁移创建数据库有什么想法吗?我愿意接受有关数据库创建的任何最佳实践,这些实践可以处理不同环境的数据库 URL。

最佳答案

我添加了一个 postinstall 脚本来运行这样的脚本:

'use strict';

async function createDatabase() {
  const config = require(process.cwd() + '/knexfile');
  config.connection.database = null;
  const knex = require('knex')(config);

  await knex.raw('CREATE DATABASE asd');
  await knex.destroy();
}

createDatabase();

这样我就没有将此步骤存储为迁移,但我确实没有看到有人想要删除整个数据库的用例。

您如何看待这种方法?

关于sql - 在 Knex 迁移中创建数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49690856/

相关文章:

Python 命令行应用程序迁移到基于 Web

php - SQL 选择不区分大小写的文本,但不选择 Latex 函数名称

mysql - 为什么我的 SQL 语句会抛出语法错误?

mysql - GROUP BY 列名而不在 SELECT 列表中选择它

c - ODBC v Libpq : C library for PostgreSQL

sql - 使用 ON CONFLICT 从 INSERT 返回行而不需要更新

sql - Postgres Large table Select Query With In Clause 的最佳索引选择

ruby-on-rails - 我可以只使用从 Rails 迁移来维护数据库模式吗?

php - 从sql表中提取链接作为可点击链接

ruby-on-rails - 未创建索引