Node.js Sequelize CLI如何从模型创建迁移?
我有两个模型,一对多 我不知道如何创建迁移文件。每个模型是否都有自己的迁移文件,或者一个迁移文件可以从模型及其之间的关系创建多个表(例如,在rails迁移中) 我看了很多例子,包括Sequelize文档,还有一些模型创建和迁移的原始例子Node.js Sequelize CLI如何从模型创建迁移?,node.js,migration,sequelize.js,Node.js,Migration,Sequelize.js,我有两个模型,一对多 我不知道如何创建迁移文件。每个模型是否都有自己的迁移文件,或者一个迁移文件可以从模型及其之间的关系创建多个表(例如,在rails迁移中) 我看了很多例子,包括Sequelize文档,还有一些模型创建和迁移的原始例子 //User model module.exports = function (sequelize, Sequelize) { var User = sequelize.define('users', { id: {
//User model
module.exports = function (sequelize, Sequelize) {
var User = sequelize.define('users', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
},
password: {
type: Sequelize.STRING,
allowNull: false,
},
});
return User;
}
//Order model
module.exports = function (sequelize, Sequelize) {
var Order = sequelize.define('orders', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
price: {
type: Sequelize.INTEGER,
allowNull: false,
},
totalPrice: {
type: Sequelize.INTEGER,
allowNull: false,
},
});
return Order;
}
//db.js
//Relations
db.orders.belongsTo(db.users);
db.users.hasMany(db.orders);
加成 我为两个模型创建了迁移:
module.exports = {
up: function (queryInterface, Sequelize, done) {
return [
queryInterface.createTable('users', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
},
password: {
type: Sequelize.STRING,
allowNull: false,
},
}),
queryInterface.createTable('orders', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
price: {
type: Sequelize.INTEGER,
allowNull: false,
},
totalPrice: {
type: Sequelize.INTEGER,
allowNull: false,
},
userId: {
type: Sequelize.INTEGER,
references: {
model: 'users',
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
}
}),
done()
]
},
down: function (queryInterface, Sequelize, done) {
return [
queryInterface.dropTable('users'),
queryInterface.dropTable('orders'),
done()
]
}
};
我需要为我的模型添加迁移文件类方法吗
//for Order
classMethods: {
associate: function(models) {
Model.belongsTo(models.users, (as: 'users'));
}
}
//for User
classMethods: {
associate: function(models) {
Model.hasMany(models.orders, (as: 'orders'));
}
}
//增补2
为了创建新的迁移文件,您需要调用
sequelize migration:create
,它在/migrations
目录中创建新文件(即默认迁移目录,可以不同)。在迁移文件中,您可以使用它来创建表、更新表或指定的表列等。如果需要,您可以在单个迁移文件中创建所有数据库表。模型和迁移文件之间没有直接的联系——它们彼此独立。模型/表之间的关系也是如此。您需要指定给定表中的给定列引用其他表
// example column definition inside migration file
// creates a foreign key referencing table 'users'
userId: {
type: Sequelize.INTEGER,
references: {
model: 'users',
key: 'id'
},
onDelete: 'CASCADE'
}
您只需要记住模型中的字段定义和迁移文件中与指定模型/表对应的字段/列定义之间的一致性
您还可以使用命令sequelize model:create
,该命令同时创建用于定义sequelize模型的文件,以及负责创建与此模型对应的表的迁移文件
要显示所有可能的sequelize cli
命令,只需运行sequelize help
编辑
类方法(如associate
)只能出现在模型定义文件中,而不能出现在移植文件中
编辑2
在迁移文件(如createTable
中使用的函数是异步的,因此不能像在迁移文件中那样简单地按顺序运行它们。您可以通过.then()
方法链接它们,或者像
return [queryInterface.createTable(...), queryInterface.createTable(...)];
谢谢,我创建了迁移文件,并将其添加到带有附加问题的问题中。我已更新了答案。简而言之,类方法只在模型定义文件中定义,而不是在迁移文件中定义。我做了迁移,得到了控制台消息:==20170319144537-create_users_and_orders:migrating===20170319144537-create_users_and_orders:migrated(0.100s),但在db中我只看到一个“users”表。在
下拉函数中,您需要将dropTable('users')
与dropTable('orders')
交换。首先您需要删除表订单
,然后您可以删除用户
,因为用户
在订单
中引用,所以需要将其作为第二个删除。请尝试撤消
迁移,然后再次运行迁移,并告知dbAnyway I not get orders表中是否仍然只有一个表。将屏幕添加到问题。