2016-05-02 5 views
0

Ich habe die folgende Datenbankstruktur (ausgedrückt in SQLite Dialekt) beinhaltet:Sequelize spezielle Abfrage, die „letzte eingefügte Zeile id“

CREATE TABLE `Clocks` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `time` DATETIME); 
CREATE TABLE `Operations` 
(
    `_id` UUID NOT NULL PRIMARY KEY, 
    `finished` TINYINT(1) NOT NULL DEFAULT 0, 
    `launchedOn` BIGINT REFERENCES `Clocks` (`_id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    `finishedOn` BIGINT REFERENCES `Clocks` (`_id`) ON DELETE SET NULL ON UPDATE CASCADE 
); 

Nun, was ich erreichen möchte in Sequelize.js wie die folgenden SQL aussieht Abfrage in SQLite:

BEGIN TRANSACTION; 
    INSERT INTO Clocks(time) VALUES (date('now')); 
    INSERT INTO Operations(_id, finished, userId, launchedOn) VALUES ('00000000-0000-0000-0000-000000000001', 0, last_insert_rowid()); 
COMMIT; 

und folgende:

BEGIN TRANSACTION; 
    INSERT INTO Clocks(time) VALUES (date('now')); 
    UPDATE Operations 
    SET  finished = 1, 
      finishedOn = last_insert_rowid() 
    WHERE _id = '00000000-0000-0000-0000-000000000001'; 
COMMIT; 

ich habe habe einige inves Tigation mit Sequelize.js, ich habe eine Idee, wie man die oben genannten Transaktionen organisiert, aber ich habe keine Ahnung, wie man last_insert_rowid() in die Liste der eingefügten Elemente aufnimmt. Diese Funktion ist übrigens SQLite-spezifisch, gibt es dafür eine datenbankübergreifende Alternative?

Vielen Dank im Voraus!

+0

Wenden Sie bei beiden Abfragen last_insert_rowid() an, um die ID der zuvor eingefügten Uhr abzurufen? – paolord

+0

Ja, das ist die richtige Antwort ... :) – Lu4

Antwort

1

Sie können diese versuchen, Sie können das resultierende Objekt beim Einfügen zurückgeben und es bei der nächsten Abfrage verwenden.

die erste Abfrage:

return sequelize.transaction(function (t) { 
    return Clocks.sync().then(function(){ 
    return Clocks.create({ 
     time: Sequelize.fn('date', 'now') 
    }); 
    }).then(function(clock){ 
    return Operations.sync().then(function(){ 
     return Operations.create({ 
     id: '00000000-0000-0000-0000-000000000001', 
     finished: 0, 
     launchedOn: clock.id 
     }, {transaction: t}); 
    }); 
    }); 
}); 

zweite Abfrage:

return sequelize.transaction(function (t) { 
    return Clocks.sync().then(function(){ 
     return Clocks.create({ 
      time: Sequelize.fn('date', 'now') 
     }); 
     }).then(function(clock){ 
     return Operations.sync().then(function(){ 
      return Operations.update({ 
        finished: 1, 
        finishedOn: clock.id 
       }, 
     {where: { id: '00000000-0000-0000-0000-000000000001'}}, 
     {transaction: t}); 
     }); 
     }); 
}); 

Ich bin mir ziemlich sicher, dass Sie das gleiche auf andere Dialekte tun können.

+0

Soweit ich verstanden habe, wird Sequelize nicht den tatsächlichen 'clock.id' Wert in' Operations.create' verwenden, es wird irgendwie herausfinden, dass ich auf die Referenz verweisen möchte ID des vorherigen Aufrufs und zum Rendern der SQL-Abfrage verwenden. Oder ich vermisse etwas und 'Clock.create' wird tatsächlich ausgeführt (Abfrage wird an DB gesendet und die Ergebnisse werden erhalten) und nur dann wird' Operations.create' den Wert verwenden, der von vorherigem Aufruf zurückgegeben wurde. Was würde bedeuten, dass SQL-Anweisungen einzeln an die DB gesendet werden? – Lu4

Verwandte Themen