Как выполнять соединения и отношения SQL в Sails.js и Waterline?

Кто-нибудь может подсказать, как настроить реляционную схему и выполнить соединения в sails.js?


person Brieuce Wayne    schedule 16.07.2013    source источник
comment
возможный дубликат соединения Sails JS Waterline нескольких моделей   -  person givanse    schedule 31.05.2015


Ответы (2)


Ассоциации официально поддерживаются в Waterline

Обзор

Из документации:

С Sails и Waterline вы можете связать модели из нескольких хранилищ данных. Это означает, что даже если ваши пользователи живут в PostgreSQL, а их фотографии — в MongoDB, вы можете взаимодействовать с данными так, как если бы они жили вместе в одной базе данных. У вас также могут быть ассоциации, охватывающие разные соединения (например, хранилища данных/базы данных) с использованием одного и того же адаптера. Это удобно, если, например, вашему приложению необходимо получить доступ к устаревшим данным рецептов, хранящимся в базе данных MySQL в центре обработки данных вашей компании, или обновить их, а также сохранить или получить данные об ингредиентах из совершенно новой базы данных MySQL в облаке.

Поддерживаемые типы ассоциаций

Запланированные типы ассоциаций


Исходное сообщение

Я автор Waterline, ORM, используемого в Sails. Waterline — это совершенно новый продукт, и мы постоянно добавляем новые функции. В настоящее время у нас нет поддержки ассоциаций, но это следующее в дорожной карте. Мы разработали API для ассоциаций, который, я думаю, понравится большинству людей. Вы можете просмотреть текущую работу и предлагаемый API по адресу: [Proposed Sails Associations API][1].

Далее мы собираемся заняться ассоциациями и транзакциями и надеемся, что они будут готовы в следующем месяце или около того.

В то же время, если вы используете адаптеры MySQL или PostgreSQL, они оба предоставляют необработанный метод .query(), который позволяет вам передать созданный вручную SQL-запрос и выполнить его. Я полностью понимаю, что это не идеально, но должно позволить вам продолжать создавать свое приложение, пока мы получаем поддержку ассоциаций и объединений.

Сигнатура функции для метода запроса:

Model.query(<sql query>, <optional data>, callback);
person particlebanana    schedule 31.07.2013
comment
где можно найти документацию по методу Model.query? - person Johan Dettmar; 20.11.2013
comment
Было бы неплохо, если бы пользовательские методы экземпляра по-прежнему были доступны при использовании метода model.query. Я полагаю, поскольку метод Model.query принимает произвольный sql, это усложняет синхронизацию с моделью? - person Kory; 28.11.2013
comment
Поскольку он принимает все, что мы не знаем, какие данные коллекции мы получаем обратно. Вы должны иметь возможность создать новый экземпляр модели, выполнив что-то вроде: var instance = User._model(values) - person particlebanana; 15.01.2014
comment
Можно ли объединить несколько таблиц с помощью парусов версии 0.10.0-rc7? - person Sandro Adamia; 29.05.2014
comment
Как можно добавить параметры в запрос, полагаю можно с ‹необязательными данными› можно? - person dpineda; 30.05.2014
comment
@particlebanana Пожалуйста, ознакомьтесь с моим вопросом здесь, так как он напрямую связан здесь. Документы не были обновлены, чтобы показать, как использовать через ассоциации. Нам нужна ваша помощь - person OneHoopyFrood; 28.10.2014
comment
@avian Я обновил ответ, указав последние функции Waterline. Ассоциации и соединения теперь официально поддерживаются из коробки. - person Travis Webb; 20.04.2015
comment
@particlebanana Пожалуйста, помогите мне - как я могу создать пользовательский запрос? Мне нужно создать запрос SELECT p.id, p.name, count(c.id) FROM parent p JOIN child c ON c.parent_id=p.id GROUP BY p.id - person Crusader; 21.09.2016

Пример с частицей банана работает, но на самом деле должен использовать «новый», например «var instance = new User._model(values)». Я использую следующий код, и он работает.

Accounts.query(query, function(err, accounts) {
  if (err)
    return fn(err);

  accounts = _.map(accounts, function(account) {
    return new Accounts._model(account);
  });

  fn(null, accounts);
});
person Bruce Kim    schedule 11.02.2014
comment
Разве это не блокирующее заявление? Вы должны дождаться завершения этой _.map, прежде чем она продолжится. На Node лучше использовать что-то вроде async.js: github.com/caolan/async чтобы полностью исключить блокирующий код. - person Glen Selle; 12.03.2014
comment
В new Accounts._model() не выполняется ввод-вывод, поэтому он не блокируется и ничего не выиграет от асинхронности. - person Dave; 21.03.2014