Какой ORM для node.js?
Я знаю, что это общий вопрос, но я провел тесты, и мне нужны некоторые особенности!
Мне нужны функции:
- свойства карты для имен столбцов
- используйте имя таблицы, отличное от имени модели
- поддержка мягких удалений (параноидальный режим при продолжении)
- поддержка записи по времени (с возможностью указать для каждой другой модели имя столбца)
- поддержка внешних ключей
- должен поддерживать mysql и sqlite
- архитектура должна поддерживать модель для каждого файла
Дополнительные функции:
-
кеш
- (поддержка redis/memcache)
- инструмент командной строки для генерации моделей из базы данных
Я тестировал:
- node -orm
- для обработки собственных имен столбцов вам необходимо обходное решение
- мягкие удаления не поддерживаются и не могут поддерживаться даже при использовании внешнего плагина (я попытался написать один, используя hook раньше, но я могу "остановить" его от удаления записи)
- не поддерживают модель для файла (вам нужно обходное решение)
- sequelize
- не создавать внешние ключи
- невозможно сопоставить свойства с именами столбцов
- поддержка модели для каждого файла, но она не работает очень хорошо (вам нужно установить отношения в файл, который включает в себя модели)
- node -persist
- Мне не нравится необходимость указывать экземпляр подключения для всего
Сейчас я собираюсь проверить JugglingDB и Bookshelf.js(но мне не нравится слишком много последнего).
Ответы
Ответ 1
Книжная полка должна в настоящее время поддерживать все эти функции:
- Отображение столбцов в именах свойств с помощью
format и
parse.
- Использование другого имени таблицы с помощью
tableName.
- Отметка времени может принимать пользовательские столбцы с
hasTimestamp
атрибут.
- Внешние ключи могут быть определены с помощью
knex построитель схем... они плохо документированы, но вы можете
см. пример в тестах здесь
- Поддержка mysql, sqlite и postgres
-
Определенно поддерживает одну модель на файл... отношения определены в методах, поэтому вы можете сделать:
var Classroom = Bookshelf.Model.extend({
tableName: 'classrooms',
student: function() {
// Relating to a model from a file in the same directory.
return this.hasMany(require('./student'));
}
});
new Classroom({id: 1})
.fetch({withRelated: ['students'])
.then(function(classroom) {
console.log(JSON.stringify(classroom));
});
Официальная поддержка мягкого удаления находится в работе, но, безусловно, легко достигается путем расширения модели и предоставления нового метода уничтожения следующим образом:
destroy: function(options) {
if (options.softDelete) {
return this.save({'deleted_at': new Date});
}
return bookshelf.Model.prototype.destroy.call(this, arguments);
}
Он еще не зацепился за кеш, потому что недействительность кэша при отношениях довольно сложная, определенно что-то рассматривается.
Если вы видите что-то, что кажется отсутствующим, не стесняйтесь открывать билет.
Ответ 2
Вы можете взглянуть на свет: https://github.com/knyga/light-orm
Простая ORM. Не создавайте внешние ключи. Невозможно сопоставить свойства с именами столбцов. Но может быть связано с любыми rdbms и супер просто.