Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Knex.js迁移将现有数据复制到其他表_Node.js_Postgresql_Database Migration_Knex.js - Fatal编程技术网

Node.js Knex.js迁移将现有数据复制到其他表

Node.js Knex.js迁移将现有数据复制到其他表,node.js,postgresql,database-migration,knex.js,Node.js,Postgresql,Database Migration,Knex.js,通过Knex.js迁移,是否可以将数据从一个表复制到另一个表 用例如下所示: 我有一个表a,我想将其拆分为两个新表B和C。理想情况下,我会循环a中的行,在B和C中创建适当的行,并用正确的信息填充它们 这可以在迁移文件中完成吗?从这个问题开始,我觉得在Node.JS中进行迁移的方法相当复杂(例如,与ActiveRecord相比)。有没有更好、更易于管理的方法来进行此类迁移?或者这是行业标准吗?我的理解是迁移只处理在表中执行CRUD操作 knex允许您在迁移完成后调用函数: `knex.migrat

通过Knex.js迁移,是否可以将数据从一个表复制到另一个表

用例如下所示: 我有一个表a,我想将其拆分为两个新表B和C。理想情况下,我会循环a中的行,在B和C中创建适当的行,并用正确的信息填充它们


这可以在迁移文件中完成吗?从这个问题开始,我觉得在Node.JS中进行迁移的方法相当复杂(例如,与ActiveRecord相比)。有没有更好、更易于管理的方法来进行此类迁移?或者这是行业标准吗?

我的理解是迁移只处理在表中执行CRUD操作

knex允许您在迁移完成后调用函数:

`knex.migrate.latest()
.then(function() {
  return knex.seed.run();
})
.then(function() {
  // migrations are finished
});` 
因此,您可以将代码添加到种子文件中,也可以简单地作为函数添加,如图所示。
请注意,此函数仅在迁移完成后调用,这意味着您的表A仍然必须存在(无法删除)。

以下是相关的

在迁移文件中传递给
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'))
};

在这种情况下,您也可以只保留
表a
,而不是创建第三个表,只需删除两列并重命名该表即可。但是,请注意,如果表已经与数据库中的其他表有关系,那么像这样拆分表会变得混乱。

这意味着我需要一个额外的脚本来运行此特定迁移?因为这种方法的挑战在于,数据操作与迁移本身相关联,而不仅仅是“最新”的迁移。在Node.JS+Knex中,这是唯一的方法吗?恐怕我没有资格回答这个问题。如果你只是想用活动记录模式保存数据,你应该试试bookshelf.JS。它是一个构建在knex.js之上的ORM。Knex只是一个查询生成器。我已经使用过Bookshelf.JS,但我的问题实际上与更改数据库结构有关,而不是从数据库中保存/获取数据。