Sequelize hasMany 失败

Posted

技术标签:

【中文标题】Sequelize hasMany 失败【英文标题】:Sequelize hasMany fails 【发布时间】:2018-07-21 08:18:06 【问题描述】:

我正在尝试与 Sequelize 建立一对多关联:

这是我的项目:

'use strict';
import  models  from '../sequelize/index';
var ProjectImages = require('./projectImages');

module.exports = (sequelize, DataTypes) => 
    const Projects = sequelize.define(
        'Projects',
        
            id: 
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: DataTypes.INTEGER,
            ,

            title: 
                type: DataTypes.STRING,
            ,
        ,
        
    );
    Projects.associate = function(models) 
        // associations can be defined here
        Projects.belongsToMany(models.Tags,  through: models.TagsProjects );
        Projects.hasMany(models.ProjectImages);
    ;

    return Projects;
;

这里是项目的图片:

'use strict';
import  models  from '../sequelize/index';

module.exports = (sequelize, DataTypes) => 
    const ProjectImages = sequelize.define(
        'ProjectImages',
        
            id: 
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: DataTypes.INTEGER,
            ,

            img: 
                type: DataTypes.STRING,
            ,

            createdAt: 
                allowNull: false,
                type: DataTypes.DATE,
                defaultValue: DataTypes.literal('CURRENT_TIMESTAMP'),
            ,

            updatedAt: 
                allowNull: false,
                type: DataTypes.DATE,
                defaultValue: DataTypes.literal('CURRENT_TIMESTAMP'),
            ,
        ,
        
    );

    return ProjectImages;
;

我正在使用类似于this snippet 的内容同步数据库。如果我不尝试在 ProjectImages 中创建任何行,我不会收到任何错误;但是如果我尝试用这个创建行(存在 id: 1 的项目):

"ProjectImages": [
    
        "id": 1,
        "img": "https://fakeimg.pl/500x500/",
        "ProjectsId": 1
    
],

我收到此错误:

Executing (default): INSERT INTO `ProjectImages` 
(`id`,`img`,`createdAt`,`updatedAt`,`ProjectId`) 
VALUES
(1,'https://fakeimg.pl/500x500/',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,1);
[1] Unhandled rejection SequelizeForeignKeyConstraintError: 
Cannot add or update a child row: a foreign key constraint fails 
(`9uhfggfhf2`.`projectimages`, 
CONSTRAINT `projectimages_ibfk_1` 
FOREIGN KEY (`ProjectId`) 
REFERENCES `Projects` (`id`) 
ON DELETE SET NULL 
ON UPDATE CASCADE)

另外,如果我在同步时没有向 ProjectsImages 添加一行,我也不会收到任何错误,并且如果我尝试在 DB 中手动插入该行:

INSERT INTO `ProjectImages` (`id`,`img`,`createdAt`,`updatedAt`,`ProjectsIdA`) 
VALUES (1,'https://fakeimg.pl/500x500/',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,1);

它没有任何问题。

有人知道那里发生了什么吗?

【问题讨论】:

【参考方案1】:

正如我所说,我使用类似于 this 的东西来与数据库同步。

在 sn-p 结束时,我必须播种数据:

seed([
    articles, 
    projectImages, 
    projects, 
    tags, 
    tagsProjects, 
    users, 
    usersLogins
]);

您会注意到,我在创建projects 之前插入了projectImages。按正确的顺序放置东西可以解决问题。

seed([
    articles, 
    projects, 
    projectImages, 
    tags, 
    tagsProjects, 
    users, 
    usersLogins
]);

:)

【讨论】:

以上是关于Sequelize hasMany 失败的主要内容,如果未能解决你的问题,请参考以下文章

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

Sequelize hasMany工作正常,但反比关系不正常

Sequelize hasMany 通过另一个表

model.hasMany 调用的东西不是 Sequelize.Model 的子类

hasMany调用的东西不是Sequelize.Model的实例

在 Sequelize 中创建对象字段