node.js – 续集模型,迁移文件和外键.哪一个是对的?

在我第一次开始研究续集时,我只是不知道,只需要复制并粘贴代码来实现两个模型之间的关系.

我是否必须将外键插入模型文件和迁移文件或仅迁移文件,这让我很困惑.

我知道迁移是具有更改数据库命令的文件.

所以我们必须手动将外键插入迁移文件,以便数据库可以创建它们.

在sequelize doc中,如果我们添加有许多属于的关系,sequelize会自动添加外键.

所以我真的很困惑我是否必须添加它们.

在答案是五十五分之前我问过的一些问题.

有人说我们不必手动将外键添加到模型中,因为sequelize会自动添加它们.

但有些人说我们必须手动将外键添加到模型中,因为我们必须在模型和迁移文件之间匹配(同步)列.

更糟糕的是,解释关于续集关系的文章彼此不同.

那么,哪一个是对的?

我真的想得到明确的答案.

得到一些理由(如果我们必须在模型中添加外键)真的很感激

不夸张,我对这个问题好奇了大约六个月.

解决方法

在创建迁移时,您还应该编写外键.也可以在模型中编写它,因此很容易处理查询.
我们可以通过示例看到它.考虑他们是两个表Item和Item_Types

1 Item_type有很多项,所以

Item_type的迁移文件(migration_create_item_type.js)

'use strict';
module.exports = {
up: function (queryInterface,Sequelize) {
    return queryInterface.createTable('item_types',{
        id: {
            allowNull: false,autoIncrement: true,primaryKey: true,type: Sequelize.INTEGER
        },item_type: {
            type: Sequelize.STRING
        },type_desc: {
            type: Sequelize.STRING
        },createdAt: {
            allowNull: true,type: Sequelize.DATE,defaultValue: Sequelize.Now
        },updatedAt: {
            allowNull: true,defaultValue: Sequelize.Now
        }
    });
},down: function (queryInterface,Sequelize) {
    return queryInterface.dropTable('item_types');
}
};

项目的迁移文件(migration_create_item.js)

'use strict';
module.exports = {
up: function (queryInterface,Sequelize) {
    return queryInterface.createTable('items',item_name: {
            type: Sequelize.STRING
        },item_desc: {
            type: Sequelize.STRING
        },item_type_id: {
            type: Sequelize.INTEGER,references: {
                model: 'item_types',key: 'id'
            }
        },createdAt: {
            allowNull: false,type: Sequelize.DATE
        },updatedAt: {
            allowNull: false,type: Sequelize.DATE
        }
    });
},Sequelize) {
    return queryInterface.dropTable('items');
}
};

请注意,始终创建父表,然后创建其他表,即创建所有没有外键的表,然后创建其他表

模型文件Item_type(item_type.js)

'use strict';
module.exports = function (sequelize,DataTypes) {
var item_type = sequelize.define('item_type',{
    item_type: DataTypes.STRING,type_desc: DataTypes.STRING
});
item_type.associate = function (models) {
    item_type.hasMany(models.item,{foreignKey: 'item_type_id'});
};
return item_type;
};

模型归档项目(item.js)

'use strict';
 var Logger = require('./../utils/logger');

 var log = new Logger('item_type_factory');
 module.exports = function (sequelize,DataTypes) {
 var item = sequelize.define('item',{
    item_name: DataTypes.STRING,item_desc: DataTypes.STRING
 });
 item.associate = function (models) {
    item.item_type = item.belongsTo(models.item_type,{foreignKey: 'id',target_key: 'item_type_id'});
    item.order_details = item.hasMany(models.order_details);
    item.user = item.belongsToMany(models.user,{through: 'supplier_items'})
};

item.addNewItem = function (data) {
    return item.create(data,{include: [{association: item.item_type}]});
};

item.findAndCreate = function (data,item_name) {
    return new Promise(function (resolve,reject) {
        item.findOrCreate({
            where: {'item_name': item_name},defaults: data
        }).spread(function (record_data,created) {
            resolve(record_data);
        }).catch(function (insert_error) {
            reject(insert_error);
        });
    });
};

item.findAllItems = function () {
    return item.findAll({
        include: [{association: item.item_type}]
    });
};
return item;
};

有关sequlize基础知识,您可以参考以下文章,
Getting started with Sequelize仅限基础知识.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...