Sequelize 移动迁移
Sequelize umzug migrations
我正在使用 sequelize js
并开发了一个 node js application
,它已部署到生产环境并拥有实时数据库。
在开发模式下,如果我需要 alter
DB
,我曾经使用 Sequelize.sync({ force: true })
来完成它并且它有效嗯。
但是现在,开发完成后我想修改一个table并向其中添加一列。
我搜索了很多帖子,但没有找到关于如何 运行 这些迁移的确切示例。
我尝试使用 Umzug
和 运行 进行迁移,但它向我抛出错误。
这是我试过的代码,
migrations/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
。请帮帮我。
您需要在传递给 Umzug
的构造函数的对象的 migrations
属性中定义 params
属性 - 它定义传递给up
和 down
函数。我想配置对象应该如下
{
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()
,因此简单地 queryInterface
,而 DataTypes
参数就是 Sequelize
本身。
model
属性用于定义一个Sequelize迁移模型,如果您对默认的SequelizeMeta
table创建满意,则无需定义。 Here is how the Umzug
constructor object should look like, and here 是 storageOptions
的样子。
编辑
在单独的文件中,您需要创建一个 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)
我正在使用 sequelize js
并开发了一个 node js application
,它已部署到生产环境并拥有实时数据库。
在开发模式下,如果我需要 alter
DB
,我曾经使用 Sequelize.sync({ force: true })
来完成它并且它有效嗯。
但是现在,开发完成后我想修改一个table并向其中添加一列。
我搜索了很多帖子,但没有找到关于如何 运行 这些迁移的确切示例。
我尝试使用 Umzug
和 运行 进行迁移,但它向我抛出错误。
这是我试过的代码,
migrations/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
。请帮帮我。
您需要在传递给 Umzug
的构造函数的对象的 migrations
属性中定义 params
属性 - 它定义传递给up
和 down
函数。我想配置对象应该如下
{
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()
,因此简单地 queryInterface
,而 DataTypes
参数就是 Sequelize
本身。
model
属性用于定义一个Sequelize迁移模型,如果您对默认的SequelizeMeta
table创建满意,则无需定义。 Here is how the Umzug
constructor object should look like, and here 是 storageOptions
的样子。
编辑
在单独的文件中,您需要创建一个 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)