2017-07-17 153 views
0

是否可以通過Knex.js遷移將數據從一個表複製到另一個表?Knex.js遷移將現有數據複製到其他表

用例如下:我有一個表A,我想分成兩個新表B和C.並填寫正確的信息。

這可以在遷移文件內完成嗎?從這個問題來看,我覺得這種在Node.JS中進行遷移的方式非常複雜(例如,與ActiveRecord相比)。有沒有更好的,更有管理的方式來做這樣的遷移?或者這是行業標準?

回答

1

沒有什麼特別之處到遷移文件中的updown功能通過查詢生成器對象。您可以像使用應用程序中任何其他查詢構建器實例一樣使用它,即在遷移過程中運行任何您想要的查詢。

這是一個非常簡單的例子。鑑於你有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

我的理解是遷移只處理在表格中執行CRUD操作。

knex允許你調用一個函數的遷移完成後:

`knex.migrate.latest() 
.then(function() { 
    return knex.seed.run(); 
}) 
.then(function() { 
    // migrations are finished 
});` 

所以,你可以在任何一個種子文件或簡單地作爲一個函數中添加代碼,如圖所示。
請注意,此功能僅在遷移完成後纔會調用,這意味着您的表A仍然必須存在(不能被刪除)。
下面是相關documentation

+0

所以這意味着我需要一個額外的腳本來運行這個特定的遷移?由於這種方法面臨的挑戰是數據操作與遷移本身相關聯,而不僅僅是「最新」的遷移。 這是在Node.JS + Knex中完成它的唯一方法嗎? –

+0

我可能沒有足夠的資格來回答這個問題,很害怕。如果您只是在尋找一種使用Active Record模式保存數據的方法,那麼您應該試試bookshelf.js。它是建立在knex.js之上的一個ORM。 Knex只是一個查詢生成器。 – zacurry

+0

http://bookshelfjs.org/#section-Model – zacurry

相關問題