Sequelize - 无法在1:N关系中保存关联

时间:2017-05-25 13:28:24

标签: postgresql orm sequelize.js rdbms

你在做什么?

尝试添加关联并将其保存到数据库

js

var Device = models.Device;
var Log = models.Log;;

var logs = [
    {
        "message_level" : 1,
        "message" : "test log 1"
    },
    {
        "message_level" : 1,
        "message" : "test log 2"
    },
    {
        "message_level" : 1,
        "message" : "test log 3"
    }
];

var devID = 'X3dE4DEW';

describe('Logs', function() {
    it('should create log', function(done) {
        Device.create({
            "originalID" : devID
        }).then(
            function() {
                return Device.findOne({"where": {originalID: devID}, 
                                       include: [ { model: Log, as : "Logs" } ] }).then(
                    function(device) {
                        if (device) {
                            logs = logs.map(
                                function(log) {
                                    return Log.build(log);
                                }
                            );
                            console.log(logs) // is NOT Empty -> OK
                            return device.addLogs(logs).then(
                                function(device) {
                                    return device.getLogs().then(
                                        function(logs) {
                                            console.log(logs); // EMPTY [] -> NOT OK
                                            logs.length.should.equal(3);
                                            done();
                                        }
                                    );
                                }
                            );
                        }

                        return Promise.reject('Not valid Device ID');
                    }
                ).catch(function(error){
                    console.log(error);
                    done();
                });
            }
        );
    });
});

这里是如何定义的

// models
// Device
  Device = pg.define('device', {
    originalID: {
      type: Sequelize.STRING(16) // Up to 16
    }
  });

// LogRecord
  Log = pg.define('log', {
    message_level: {
      type: Sequelize.INTEGER
    },
    message: {
      type: Sequelize.STRING(100) // Up to 100
    }
  });
  Device.hasMany(Log, { as : "Logs" });
  Log.belongsTo(Device);

您期望发生什么?

addLogs应该将关联项目保存到数据库

实际发生了什么?

未保存项目,device.getLogs()返回空数组[]

{ AssertionError: expected 0 to equal 3 }

方言: PG 数据库版本: 9.6.1 Sequelize版本: ~3.30.x

1 个答案:

答案 0 :(得分:0)

有几种关联行的解决方案

  • 如果您正在使用add<Association(s)>功能,请确保关联的对象已存储在数据库中。

  • 或者您可以使用create<Association>创建模型和关联。

    var device;
    Device.create({
        "originalID" : devID
    }).then(function(createdDevice) {
        device = createdDevice;
        return Promise.all(logs.map(log=>{return device.createLog(log);}));
    }).then(function(result) {
        return device.getLogs();
    }).then(function(logs) {
        console.log(logs);
        logs.length.should.equal(3);
        done();
    }).catch(function(error){
        console.log(error);
        done();
    });
    

    使用上面的承诺风格,它更容易理解,而不是&#34;深入承诺&#34;。