2013-07-22 15 views
12

Więc gram z NodeJS/Express w trochę z teraz i ja naprawdę chciałbym spróbować przepisać stosunkowo dużą poboczny projekt przy użyciu pełnej JavaScript stos po prostu zobaczyć, jak to będzie działać. Sails.js wydaje się być bardzo dobrym wyborem dla backend NodeJS dla API REST z obsługą gniazd internetowych, który jest dokładnie to, czego szukam jednak jest jeszcze jeden problem szukam rozwiązać i to transakcyjny SQL wewnątrz NodeJS.transakcyjna SQL z Sails.js

Większość warstwa danych/ORMs widziałem na stronie NodeJS rzeczy wydają się nie obsługuje transakcji w kontaktach z MySQL. ORM dostarczany z Sails.js (Waterline) również nie obsługuje transakcji, które są dziwne, ponieważ widziałem miejsca, w których wspomniano o nich, chociaż te komentarze są dość stare. Knex.js obsługuje transakcje, więc zastanawiałem się, czy zastąpienie ORM przez Sails.js jest bardzo łatwe (lub czy Sails.js zakłada Waterline w rdzeniu).

Zastanawiałem się też, czy istnieje ORM zbudowany na szczycie Knex.js oprócz Bookshelf jak nie jestem fanem kręgosłupy model systemu/Collection?

+0

Ciekawy co myślisz można poprawić w modelu/system zbierania lub czego nie lubią o tym. – tgriesser

Odpowiedz

6

Pracujemy nad natywnym wsparciem dla transakcji na poziomie ORM: https://github.com/balderdashy/waterline/issues/62

stowarzyszenia będzie prawdopodobnie pierwszym miejscu, ale transakcje są obok. Właśnie zakończyliśmy GROUP BY i agregacje (SUM, AVG itp.).

+1

jaki jest stan tego ... Interesuję się tylko transakcjami pojedynczego adaptera w wielu tabelach ... Widzę dokumentację mówiącą, że linia wodna zawiera transakcje, ale nie zawierająca tego oświadczenia .. lub dokumentacja, jak z niego korzystać. – jonasfj

+0

Jak właściwie wykonujesz groupBy? Ctrl + f na dokumentacji dokumentacji linii wodnej i żagli pokazuje zero wyników. Szybki przykład byłby niesamowity. – Kory

17

Nadal możesz pisać zapytania SQL bezpośrednio przy użyciu Model.query(). Ponieważ jest to funkcja asynchroniczna, będziesz musiał użyć obietnic lub async, aby ponownie go zsynchronizować. Na przykład, przy użyciu adaptera MySQL, async, a model o nazwie User:

async.auto({ 
    transaction: function(next){ 
    User.query('BEGIN', next); 
    }, 
    user: ['transaction', function(next) { 
    User.findOne(req.param('id')).exec(next); 
    }], 
    // other queries in the transaction 
    // ... 
}, function(err, results) { 
    if (err) { 
    User.query('ROLLBACK', next); 
    return next(err); 
    } 
    User.query('COMMIT', next); 
    // final tasks 
    res.json(results.serialize); 
}); 
+0

Może to nie działać, gdy jest włączone łączenie połączeń. Nie powinieneś uruchamiać BEGIN, ROLLBACK i COMMIT na oddzielnych połączeniach. –

+0

Nie będzie działać dla wielu jednoczesnych połączeń –

1

Transakcje SailsJS okazało się znacznie trudniejsze, niż przewidywano. Celem jest przekazanie adapterowi ORM wiedzy, że dwie bardzo różne akcje kontrolera w modelach mają być wysyłane za pośrednictwem pojedynczego połączenia MySQL.

Naturalny sposób, aby to zrobić jest dwa napisać nowy adapter, który akceptuje dodatkowych informacji, aby wskazać, że zapytanie należy do wywołania transakcji. Wykonanie tego wymaga zmiany w samym waterline (moduł abstrakcji ORM).

Zamówienie jeśli to pomaga - https://www.npmjs.com/package/sails-mysql-transactions

Powiązane problemy