如何使用 sequelize-fixtures 包含来自 json 文件的关联?

Posted

技术标签:

【中文标题】如何使用 sequelize-fixtures 包含来自 json 文件的关联?【英文标题】:How to Include associations from json files with sequelize-fixtures? 【发布时间】:2016-01-31 19:41:27 【问题描述】:

大家好,

我对 sequelizejs 很陌生,只是尝试使用它。我在使用 sequelize-fixtures 创建示例数据集时遇到问题。

我的模型是这样创建的:

User.js (没有 beforeCreate、beforeUpdate 挂钩)

'use strict';
module.exports = function (sequelize, DataTypes) 
    var User = sequelize.define('User', 
        email: type: DataTypes.STRING, allowNull: false,
        password: type: DataTypes.STRING, allowNull: false,
        active: type: DataTypes.BOOLEAN, default: false
    );
    return User;
;

Role.js

'use strict';
module.exports = function (sequelize, DataTypes) 
    var Role = sequelize.define('Role', 
        title: type: DataTypes.STRING, allowNull: false,
        description: type: DataTypes.STRING, allowNull: true,
        code: type: DataTypes.STRING, allowNull: false
    );
    return Role;
;

将模型导入模型对象后,我创建了它们之间的关联:

models.User.belongsToMany(models.Role, through: 'UserRole', constraints: true);
models.Role.belongsToMany(models.User, through: 'UserRole', constraints: true);

并且我已经从与结构一起使用的 json 文件中加载了示例数据,如文档所述,但由 sequelize 自动创建的 userroles 表仍然为空。

fixture json 文件包含以下内容:

[
    
        "model": "Role",
        "data": 
            "title": "Administrator",
            "description": "Administrator users",
            "code": "RIGHT_ADMIN"
        
    ,
    
        "model": "Role",
        "data": 
            "title": "Manager",
            "description": "Manager users",
            "code": "RIGHT_MANAGEMENT"
        
    ,
    
        "model": "User",
        "keys": [
            "id"
        ],
        "data": 
            "id": 0,
            "email": "admin@app.io",
            "password": "admin",
            "active": true
        ,
        "roles":[1,2]
    
]

当 db 同步后,将调用夹具加载: force:true,仅用于开发原因

db.sync(force: true).then(function () 

    //load fixtures
    SequelizeFixtures.loadFile('fixtures/*.json', models).then(function () 
        console.dir("DEV DATA CREATED SUCCESSFULLY");
    );
);

我的问题是由用户和角色模型关联创建的用户角色表在运行夹具后总是保持空白。

【问题讨论】:

【参考方案1】:

弄明白了

事实证明,sequelize Fixture 文档说可以在 json 文件中给定模型记录的数据之外定义 many2many 关系值。

解决方案是在模型的 $Model.associations 对象中找到关系关联键,并将其用作数据对象内的键。

简而言之:

这个

models.User.belongsToMany(models.Role, through: 'UserRole', constraints: true);
models.Role.belongsToMany(models.User, through: 'UserRole', constraints: true);

创建了用户模型的关联“角色”和角色模型的“用户”。

现在根据这个json记录对象应该是这样的:


    "model": "User",
    "keys": [
        "id"
    ],
    "data": 
        "id": 0,
        "email": "admin@app.io",
        "password": "admin",
        "active": true,
        "Roles":[1,2]
    

Here is a gist I'have made to show how to use it.

希望这能帮助其他使用 sequelize 和 sequelize-fixtures 的用户

【讨论】:

以上是关于如何使用 sequelize-fixtures 包含来自 json 文件的关联?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WIX 使用单个 MSI 包安装两个 MSI 包?

如何使用`add`安装多个纱线包?

如何从一个包中设置一个结构,然后使用它的原始包

如何使用 apache pig 将一个包转换为多个包?

如何使用 ServiceFabric.Mocks Nuget 包模拟配置和数据包的 CodePackageActivationContext

如何使用 Poetry 将 Python 包部署到 Gitlab 包注册表?