Node:Sequelize——Model模型,Migration迁移,Seeders种子

1.创建模型

sequelize model:generate --name 模型名称 --attributes 属性名:类型,属性名:类型

user表举例

npx sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string

命令行执行结果

  1. 在models文件夹中创建了一个user模型文件
  2. 在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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

关了个封

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值