2017-03-15 66 views
1

我正在使用sequelize js並開發了一個node js application,它已部署到生產環境並具有實時數據庫。續集umzug遷移

而在發展模式下,如果我需要alterDB,我用用Sequelize.sync({ force: true })這樣做,效果不錯。

但現在,開發完成後我想改變一個表並添加一列到它。

我搜索了很多帖子,但沒有得到關於如何運行這些遷移的確切示例。

我試圖使用Umzug並運行遷移,但它會引發我的錯誤。

這裏是我試過的代碼,

遷移/ barmigration.js:

var Sequelize = require('sequelize'); 

"use strict"; 

module.exports = { 

    up: function(migration, DataTypes) { 
     return [ 
     migration.addColumn(
     'Bars', 
     'PrinterId', 
     Sequelize.STRING 
    ), 
     migration.addColumn(
     'Bars', 
     'PrinterStatus', 
     Sequelize.STRING 
    )] 

    }, 

    down: function(migration, DataTypes) { 
     return 
     [ 
      migration.removeColumn('Bars', 'PrinterStatus'), 
      migration.removeColumn('Bars', 'PrinterId') 
     ] 
    } 

}; 

這裏是umzug configuration

var Umzug = require('umzug'); 
    var sequelize = require('sequelize'); 

    var umzug = new Umzug({ 

     // storage: 'sequelize', 
     model: 'Bar', 


     storageOptions: { 
      sequelize: sequelize, 
     }, 

     migrations: { 
      path: './migrations', 
      pattern: /\.js$/ 
     } 

    }); 

    // umzug.up().then(function(migrations) { 
    // console.log('Migration complete!'); 
    //  }); 

    umzug.down().then(function(migrations) { 
     console.log('Migration complete!'); 
    }); 

當我運行該文件,我在up function中遇到錯誤,在此位置return migration.addColumn

錯誤:

Unhandled rejection TypeError: Cannot read property 'addColumn' of undefined

因此,參數遷移似乎是undefined。請幫助我。

回答

2

您需要定義內傳遞到的Umzug構造函數的對象migrations屬性params屬性 - 它定義了傳遞給updown功能的參數。我想,配置對象應爲

{ 
    storage: 'sequelize', 
    storageOptions: { 
     sequelize: sequelize // here should be a sequelize instance, not the Sequelize module 
    }, 
    migrations: { 
     params: [ 
      sequelize.getQueryInterface(), 
      Sequelize // Sequelize constructor - the required module 
     ], 
     path: './migrations', 
     pattern: /\.js$/ 
    } 
} 

隨着上述定義的migration參數現在將成爲sequelize.getQueryInterface(),所以乾脆queryInterfaceDataTypes參數是Sequelize本身。

model屬性用於定義Sequelize遷移模型,如果您對默認的SequelizeMeta表創建滿意,則不需要定義它。 HereUmzug構造函數對象應該是什麼樣子的,而herestorageOptions的樣子。

編輯

在您需要創建一個Sequelize實例單獨的文件(還用於定義模型等),並將其導出。讓我們假設文件樹如下

- db 
    - database.js 
    - umzug.js 

所以在database.js我們創建一個Sequelize實例並將其導出。

// database.js 
const Sequelize = require('sequelize'); 

const db = { 
    sequelize: new Sequelize(connectionString, options), 
    Sequelize: Sequelize 
}; 

module.exports = db; 

然後,Umzug配置文件

// umzug.js 
const db = require('./database'); 

// here comes the configuration and initialization of Umzug instance with use of db object 
// db.sequelize -> sequelize instance 
// db.Sequelize -> sequelize constructor (class) 
+0

日Thnx您的回覆英寸但我得到錯誤,'TypeError:sequelize.getQueryInterface不是一個函數'。我在文件中需要'sequelize'。 – Sravan

+0

'sequelize.getQueryInterface'必須在Sequelize實例上運行,而不是在構造函數本身上運行。你是否在單獨的文件中創建了一個sequelize實例,並且在這個實例中需要它? – piotrbienias

+0

是的,我有一個'sequelize'的實例並導出該實例。 – Sravan