2012-02-28 2 views
4

Вот некоторые вопросы о функциях, поддерживаемых sequelize (sequelize project site), что я хотел бы прояснить, прежде чем решить, стоит ли его использовать:sequelize для NodeJS: поддерживаются ли эти функции?

  1. Цепной (КПД): При объединении нескольких запросов, которые они собраны в один запрос к базе данных (как пакет операций) или каждый отправляется отдельно?

  2. Цепочка (успех/ошибка): при соединении нескольких запросов, когда происходит событие успеха и что происходит при ошибке? Исключен ли «успех», только если все операции преуспели? И если произошла ошибка, откатываются ли все операции (т. Е. Являются цепными операциями, рассматриваемыми как транзакция)

  3. Фильтрационные ассоциации: Скажем, объект Crowd имеет отношение Crowd.hasMany(Person). Вы можете получить всех связанных людей, выполнив crowd.getPersons(), но можно ли выбрать их подмножество, например crowd.getPersons({where: { age: 30 }})?

  4. Начало, связанные объекты, связанные с двумя или более этапов: Скажите Crowd объект как отношение Crowd.hasMany(Person) и Person имеет отношение Person.hasMany(Pet). Можно ли получить всех домашних животных в толпе, выполнив что-то вроде crowd.getPersons().getPets(), и если да, то это будет отправлено как несколько запросов к базе данных или только один запрос?

  5. "Deep" объект: Я хочу, чтобы определить человека в качестве объекта:

    sequelize.define('Person', { 
        name: { 
         first: <a string>, 
         last: <a string> 
        } 
    }); 
    

    ли это разрешено? (Обратите внимание, что имя не будет столбцом таблицы базы данных, но первым и последним будет)

  6. «Рассчитанный» объект: возможно ли добавить поле к объекту, которое вычисляется из других полей объект? Например:

    sequelize.define('Person', { 
        name: { 
         first: <a string>, 
         last: <a string>, 
         full: <name.first + ' ' + name.last> // <-- this field 
        } 
    }); 
    

    Так что name.full поле фактически не хранятся в базе данных (которая является пустой тратой пространства), а просто рассчитывается из двух других?

ответ

6

1 .: Вы можете использовать для супер-пуперной обработки QueryChainer. Тем не менее, каждая команда будет выполнена отдельно.

2 .: Используя QueryChainer, событие успеха будет инициировано только в том случае, если все будет в порядке. Ошибка возникает, если произошла одна или несколько ошибок. Первым параметром связанного метода будет массив ошибок.

3 .: Хм, я не уверен на 100%, но imho еще не поддерживается.

4 .: Неа не представляется возможным, но более сложным и менее фантазии с:

crowd.getPeople().success(function(people) { 
    people.forEach(function(person){ 
    person.getPets().success... // you have to collect them on your own 
    }) 
}) 

5 .: Нет. Но я также не понимаю, почему вы это сделаете.

6.: Да, проверить это http://sequelizejs.com/docs/1.7.8/models#expansion-of-models и:

Person = sequelize.define('Person', {foo:Sequelize.STRING}, { 
    instanceMethods: { 
    fullname: function() { 
     return this.firstName + ' ' + this.lastName 
    } 
    } 
}) 
+0

Так что для # 2, если есть ошибка с одним из запросов, он будет откатить все запросы (как произошло бы в сделке)? Или цепочка запросов не рассматривается как транзакция? – bigpopakap

+1

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

+1

Было бы неплохо, если бы вместо возможности добавления методов экземпляра, если бы вы могли определить геттеры и сеттеры, которые были используется при сериализации объекта. – freakTheMighty

Смежные вопросы