我认为从第一个数据库交互开始使用迁移是个好主意,所以我想为数据库创建创建一个迁移。
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/