简体   繁体   English

区分创建记录交易

[英]sequalize create record transaction

I have three models: 我有三种模式:

    var Person = sequelize.define("Person", {
        no: {type: DataTypes.STRING, unique: true, allowNull: false}
    }, {
        classMethods: {
            associate: function(models){
                Person.hasMany(models.Task);
                Person.hasMany(models.Job);
            }
        }
    });

Task has field: description, and Job has field: title.

Now I try to use transaction to insert record, but I am stuck: 现在,我尝试使用事务插入记录,但是我被卡住了:

return sequalize.transaction(function (t) {
    return models.Person.create({
        no: '1221212'
    }, {transaction: t}).then(function (person){
        // I am stuck here, to insert multiple task and job
    }, {transaction: t});
}).then(function(result){

}).catch(function(err){

});

How can I insert multiple task and job after create a person? 创建人员后如何插入multiple任务和工作?

Option 1 选项1

You can create child objects like this: 您可以这样创建子对象:

return sequelize.transaction(function (t) {
    return Person.create({
            no: '1221212',
            Tasks: [
                { taskName: 'task1' },
                { taskName: 'task2' }
            ]}, {
                transaction: t,
                include: [ { model: Task  } ]
            }
    );
});

We use "include" option here. 我们在这里使用“包含”选项。

Here is SQL generated: 这是生成的SQL:

Executing (61834d07-de9e-4b6e-aa53-9cead8157595): START TRANSACTION;
Executing (61834d07-de9e-4b6e-aa53-9cead8157595): SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Executing (61834d07-de9e-4b6e-aa53-9cead8157595): SET autocommit = 1;
Executing (61834d07-de9e-4b6e-aa53-9cead8157595): INSERT INTO "People" ("id","no") VALUES (DEFAULT,'1221212') RETURNING *;
Executing (61834d07-de9e-4b6e-aa53-9cead8157595): INSERT INTO "Tasks" ("id","taskName","PersonId") VALUES (DEFAULT,'task1',3) RETURNING *;
Executing (61834d07-de9e-4b6e-aa53-9cead8157595): INSERT INTO "Tasks" ("id","taskName","PersonId") VALUES (DEFAULT,'task2',3) RETURNING *;
Executing (61834d07-de9e-4b6e-aa53-9cead8157595): COMMIT;

Option 2 选项2

You can also create a Person and then add Tasks to it in a bulk. 您还可以创建一个人员,然后将任务批量添加到其中。 This will work good if number of tasks is big, because it use only one INSERT operation for all tasks. 如果任务数量很大,这将很好地工作,因为它对所有任务仅使用一个INSERT操作。

return sequelize.transaction(function (t) {
    return Person.create({
            no: '00000'
        }, {
            transaction: t,
        })
    .then(function(person) {
        return Task.bulkCreate( [
                { taskName: 't1', PersonId: person.id },
                { taskName: 't2', PersonId: person.id }
            ], {
                transaction: t
            });
    });
});

We use bulkCreate function and manually set id for the foreign key field. 我们使用bulkCreate函数并为外键字段手动设置ID。 This will generate the following SQL: 这将生成以下SQL:

Executing (c9802841-6a22-4633-a006-41a78a9623b2): START TRANSACTION;
Executing (c9802841-6a22-4633-a006-41a78a9623b2): SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Executing (c9802841-6a22-4633-a006-41a78a9623b2): SET autocommit = 1;
Executing (c9802841-6a22-4633-a006-41a78a9623b2): INSERT INTO "People" ("id","no") VALUES (DEFAULT,'00000') RETURNING *;
Executing (c9802841-6a22-4633-a006-41a78a9623b2): INSERT INTO "Tasks" ("id","taskName","PersonId") VALUES (DEFAULT,'t1',4),(DEFAULT, 't2', 4)
Executing (c9802841-6a22-4633-a006-41a78a9623b2): COMMIT;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM