Max*_*e B 3 postgresql database-migration node.js knex.js
是否可以通过 Knex.js 迁移将数据从一个表复制到另一个表?
用例如下:我有一个表 A,我想把它分成两个新表 B 和 C。理想情况下,我会遍历 A 中的行以在 B 和 C 中创建适当的行,并用正确的信息。
这可以在迁移文件中完成吗?Aport from this question,我觉得这种在 Node.JS 中进行迁移的方式非常复杂(例如与 ActiveRecord 相比)。有没有更好、更有管理的方法来进行此类迁移?或者这是行业标准?
传递给迁移文件中的函数up和down函数的查询构建器对象没有什么特别之处。您可以像在应用程序中使用查询构建器的任何其他实例一样使用它,即在迁移过程中运行您想要的任何查询。
这是一个非常简单的例子。假设您有一个名为 accounts 的表,其中包含 4 个字段,您希望将其中的 1 个单独拆分为一个表:
// Starting promise chain with Promise.resolve() for readability only
exports.up = function(knex, Promise) {
return Promise.resolve()
.then(() => knex.schema.createTable('table_b', t => {
t.string('col_a')
t.string('col_b')
}))
.then(() => knex.schema.createTable('table_c', t => {
t.string('col_c')
t.string('col_d')
}))
.then(() => knex('table_a').select('col_a', 'col_b'))
.then((rows) => knex('table_b').insert(rows))
.then(() => knex('table_a').select('col_c', 'col_d'))
.then((rows) => knex('table_c').insert(rows))
.then(() => knex.schema.dropTableIfExists('table_a'))
};
exports.down = function(knex, Promise) {
return Promise.resolve()
.then(() => knex.schema.createTable('table_a', t => {
t.string('col_a')
t.string('col_b')
t.string('col_c')
t.string('col_d')
}))
.then(() => knex('table_b').select('col_a', 'col_b'))
.then((rows) => knex('table_a').insert(rows))
.then(() => knex('table_c').select('col_c', 'col_d'))
.then((rows) => knex('table_a').insert(rows))
.then(() => knex.schema.dropTableIfExists('table_b'))
.then(() => knex.schema.dropTableIfExists('table_c'))
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您也可以只保留table_a而不创建第三个表,只需删除两列并重命名该表。但是请注意,如果它已经与数据库中的其他表有关系,那么像这样拆分表会变得混乱。