1.创建模型
sequelize model:generate --name 模型名称 --attributes 属性名:类型,属性名:类型
user表举例
npx sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string
命令行执行结果
- 在models文件夹中创建了一个user模型文件
- 在migrations文件夹中创建了一个名字像20221008133141-user.js 的迁移文件
注意:_Sequelize将只使用模型文件,它是表描述,另一边。迁移文件是该模型的更改,或更具体地说CLI所使用的表,处理迁移,如提交或日志,已进行数据库的某些更改
再创建一个名为Role的模型,它跟User是一对多的关系:
npx sequelize model:generate --name Role --attributes roleName:string
2.定义模型之间的关系
Role和User是一对多的关系,一次你需要修改它们的模型定义
修改models/role.js如下
'use strict';
module.exports = (sequelize, DataTypes) => {
var Role = sequelize.define('Role', {
roleName: DataTypes.STRING
}, {});
Role.associate = function(models) {
// associations can be defined here
Role.hasMany(models.User)
};
return Role;
};
修改models/user.js如下:
'use strict';
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
firstName: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING
}, {});
User.associate = function(models) {
// associations can be defined here
User.belongsTo(models.Role, {
onDelete: "NULL",
foreignKey: {
allowNull: false
}
})
};
return User;
};
3.修改和运行迁移
Role和User是一对多的关系,因此需要修改User迁移文件的定义。
修改migrates/XXXXXXXXXXXXXX-create-user.js如下:
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
roleId: { // name of the key we're adding
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'Roles', // name of Target model
key: 'id', // key in Target model that we're referencing
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE',
},
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
},
email: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Users');
}
};
注意:这里主要给User添加了外键字段,外键字段命名有规则:通常为小写的模型名加Id,即驼峰风格。例如这里加了roleId的外键字段。
在数据库中实际创建该表,需要运行 db:migrate 命令。
sequelize db:migrate
此命令将执行这些步骤:
- 将在数据库中创建一个名为SequelizeMetade 表。此表用于记录在当前数据库上运行的迁移
- 开始寻找尚未运行的任何迁移文件。这可以通过检查SequelizeMeta表。在这个例子中,她讲运行创建的 XXXXXXXXXXXXXX-create-role.js和XXXXXXXXXXXXXX-create-user.js 迁移。
- 创建一个名为Roles的表,其中包含其迁移文件中指定的所有列
- 创建一个名为User的表,其中包含其迁移文件中指定的所有列
4.撤销迁移
撤销上一次的迁移操作
sequelize db:migrate:undo
撤销所有迁移操作
sequelize db:migrate:undo:all
具体迁移脚本
sequelize db:migrate:undo --name xxx
5.创建种子,生成测试数据
创建几个用户和角色
sequelize seed:generate --name demo-role
sequelize seed:generate --name demo-user
这个命令将会在seeders文件夹中创建两个种子文件。
文件名看起来像是XXXXXXXXXXXXXX-demo-role.js和XXXXXXXXXXXXXX-demo-user.js,它遵循相同的 up/down 语义,如迁移文件。
现在我们应该编辑这两个文件,将演示角色插入Role表,将演示用户插入User表。修改XXXXXXXXXXXXXX-demo-role.js如下:
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.bulkInsert('Roles', [{
roleName: '管理员',
createdAt:new Date(),
updatedAt:new Date()
},{
roleName: '普通用户',
createdAt:new Date(),
updatedAt:new Date()
}], {});
},
down: (queryInterface, Sequelize) => {
return queryInterface.bulkDelete('Roles', null, {});
}
};
修改XXXXXXXXXXXXXX-demo-user.js如下:
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.bulkInsert('Users', [{
roleId:1,
firstName: 'John',
lastName: 'Doe',
email: 'demo@demo.com',
createdAt:new Date(),
updatedAt:new Date()
},{
roleId:1,
firstName: 'Jack',
lastName: 'Smith',
email: 'jack@demo.com',
createdAt:new Date(),
updatedAt:new Date()
}], {});
},
down: (queryInterface, Sequelize) => {
return queryInterface.bulkDelete('Users', null, {});
}
};
种子文件修改后,即可使用如下命令将演示数据插入数据库中:
sequelize db:seed:all
6.存储记录
"seederStorage": "json",
"seederStoragePath": "sequelizeData.json",
"seederStorageTableName": "sequelize_data"
7.撤销种子文件
撤销指定种子文件
sequelize db:seed:undo --seed 指定种子文件
撤销所有种子文件
db:seed:undo:all