是否可以通过Knex.js迁移将数据从一个表复制到另一个表?
用例如下: 我有一个表A,我想分成两个新表B和C.理想情况下,我会遍历A中的行,在B和C中创建适当的行,并用正确的信息填充它们。
这可以在迁移文件中完成吗?来自这个问题的Aport,我觉得这种在Node.JS中进行迁移的方式非常复杂(例如与ActiveRecord相比)。有没有更好,更有管理的方式来进行此类迁移?或者这是行业标准吗?
答案 0 :(得分:3)
传递到迁移文件中的up
和down
函数的查询构建器对象没什么特别之处。您可以像在应用程序中使用查询构建器的任何其他实例一样使用它,即在迁移过程中运行您想要的任何查询。
这是一个非常简单的例子。假设您有一个名为包含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'))
};
在这种情况下,您也可以保留table_a
而不是创建第三个表,只需删除两列并重命名该表。但请注意,如果它与数据库中的其他表有关系,那么像这样分割你的表会变得混乱。
答案 1 :(得分:1)
我的理解是迁移只涉及在表中执行CRUD操作。
knex允许您在迁移完成后调用函数:
`knex.migrate.latest()
.then(function() {
return knex.seed.run();
})
.then(function() {
// migrations are finished
});`
因此,您可以将代码添加到种子文件中,或者只是作为所示的函数添加
请注意,只有在迁移完成后才会调用此函数,这意味着您的表A仍然必须存在(无法删除)。
这是相关的documentation