Представляем вам ORMjs
Ссылка на скачку https://www.npmjs.com/package/ormjs
ORMjs это использования стандартных структур языка яваскрипт, таких как классы, для взаимодействия с базой данных. Класс представляет собой аналог коллекции в базе данных, а инстанс класса документ в коллекции. Более подробно вот тут https://ru.wikipedia.org/wiki/ORM Статические методы класса выполняются для работы с колелкцией, а методы инстансов для работы с самим документом. Таким образом, мы работаем с базой, без селекторов или специального языка, А работаем как бы с яваскрипт обьектами и их методами. А оно само все сохраняется в базу данных. Я намеренно скрыл реализацию базы данных, чтобы можно было подключать разные драйверы для разных баз данных. База данных должна быть лишь под капотом, и учавствовать лишь в сохранении состояния инстансов, а как она это будет делать, программиста пользователя, не должно волновать. В этом и суть этого фреймворка =) Перевод документации: ORMjs это javascript ООП интерфейс для базы данных. Он использует ArangoDB, но в будущем я добавлю драйверы для других баз (таких как mongodb) Концепция: Используя ES6 оператор await, геттеры и промисы, мы можем ассинхронно совершать навигацию по дереву графов документов в базе данных. Оно рекомендуется с использованием ES6, но вы так же можете писать на ES5 Я думаю что это эпично =) Это крайне крайне крайне крайне крайне элегантное API для работы с базой данных. А что вы думаете об этом? Она использует ArangoDB https://www.arangodb.com/2015/10/ben...godb-arangodb/ По ссылке тест производительности с другими базами данных типа Mongo. API static: Model.get(_id) // получает модель по id Model.add(obj) // создает модель на основе переданного обьекта Model.remove(model) // удаляет модель Model.restore(model) // восстанавливает удаленую модель Model.save(model) // сохраняет изменения модели в базу данных Model.update(model) // загружает состояние модели из базы данных instance Model.prototype.save() // псевдоним для Model.save(this) Model.prototype.update() // псевдоним для Model.update(this) Model.prototype.remove() // псевдоним для Model.remove(this) Model.prototype.restore() // псевдоним для Model.remove(this) Основы Определим коллекцию User (именем коллекции станет имя класса) let Model = require('ormjs') class User extends Model { static schema = { // базовые типы name: String, male: Boolean, age: Number, birth: Date, tags: Set, // как массив, только с уникальными элементами status: ['sleep', 'eat'], // enum (значением поля может быть одно из перечисленных значений) // структуры messages: [String], // массив строк prop1: {prop2: [{tags: [String]}] }, // можно описывать сколь угодно сложные вложенные структуры // ссылки на сущности из других коллекций (ну или этой же) bestFriend: User, // ссылка на инстанс User friends: [User], // ссылка на массив инстансов User // опции поля name: String, name: {$type: String}, name: {$type: String, test: /^\w+$/}, } } Example 0: let Model = require('ormjs') class User extends Model { static schema = { name: String, age: Number, } } Usage: (async function () { // adding user to db let user = await User.add({ name: 'Ашот', age: 24, }) user._id // 'User/434370324723' user._removed // false user.name // 'Ашот' user.age // 24 // change field user.name = 'Ololo' console.log(user.name) // 'Ololo' field is changed // reset changes await user.update() // load state from db user.name // 'Ашот' // saving changes user.name = 'Ololo' // change field await user.save() // save changes to db await user.update() // load state from db user.name // 'Ololo' because we save }()) Example 1: let Model = require('ormjs') class User extends Model { static schema = { name: String, age: Number, friends: [User] } async addFriend(user) { let friends = await this.friends friends.push(user) await this.save() } async removeAllFriends(){ this.friends = [] await this.save() } } Usage: (async function(){ let user = await User.add({ name: 'Ivan', age: 24, friends: [] }) await user.addFriend(user) await user.addFriend(user) await user.friends // [user, user] two itself =) await user.removeAllFriends() await user.friends // [] await user.friends === await user.friends // true user.name = 22 await user.save() // ValidationError: Field `name` must be String, but have Number })() Example 2: let Model = require('ormjs') class Sector extends Model { static schema = { size: Number } } class User extends Model { static schema = { name: String, sector: Sector, } } Usage: (async function () { let sector = await Sector.add({ size: 236 }) let user = await User.add({ name: 'Ашот', sector: sector }) (await user.sector).size // 236 let sector2 = await Sector.add({ size: 1004 }) user.sector = sector2 await user.save() (await user.sector).size // 1004 because this another sector ^__^ })() Custom types: System types is: String, Number, Boolean, Data, Set Actually we can use custom types: let Model = require('ormjs') class Color { constructor(r, g, b) { this.r = r this.g = g this.b = b } // convert to db document toJSON() { return { r: this.r, g: this.g, b: this.b } } // restore from db document static fromJSON(json) { return new Color(json.r, json.g, json.b) } } class User extends Model { static schema = { name: String, color: Color } } Usage: (async function () { let user = await User.add({ name: 'Ашот', color: new Color(0, 255, 0) }) user.color instanceof Color //true }()) Schemas Number schema = { age: Number, age: {$type: Number}, age: {$type: Number, min:0, max:100} } String schema = { name: String, name: {$type: String}, name: {$type: String, min:3, max:20, test:/^\w+$/} } Set schema = { tags: Set, tags: {$type: Set}, tags: {$type: Set, set: ['animals', 'porn', 'movie']} } Enum (for any type) Field value must be one of from enum array schema = { status: ['pending', 'resolve', 'reject'] } Это часть большого проекта, но я выгрузил её как отдельный модуль NPM, возможно она будет кому-то полезна. https://github.com/uMaxmaxmaximus/ui...erver/core/orm Напишите кто нибудь статью на хабре, кто умеет писать на хабре =) |
Лол, ты же плевался с ES6) Изменил мнение?
И да, async/await - это уже ES7. |
Цитата:
Ну было дело, ну ошибался я, и про кофескрипт ошибался, ну я просто думал что вы все врете и хотите мне плохое посоветовать и зла желаете. И сами мучаетесь и хотите меня мучать. На самом деле я по прежнему ненавижу ES синтаксис и у меня в списке TODO 3 технических проэкта на ближайшие 2 года 1) MegaJS (это такой изоморфный фреймворк на базе UIjs (плюс позволит писать и под десктопы и мобилки как React Native)) 2) CoffeeScript ES6 3) Аналог THREE с физикой (на Rust компилируемый в asm.js и wasm) На самом деле эту ORM я написал за неделю, а там писать особо и нечего, потестируйте кто нить. Никогда в подобных ORM не хватало такой вот удобной ссылки на другую коллекцию let frields = await user.frields. А вообще я поражаюсь как Babel написали стейт машину для ассинхронки. Это верх элеганства. Я бы не додумался, при том каллбак выполняется в том же конетксте следовательно сохраняются общие ппеременные и общий скоуп. Это феноминально. Щас я короч пишу такой же прозрачный API для этой бд но на клиенте, чтобы можно было такой же код писать, типа дай юзера, дай его друзей и.т.п. но при том чтобы проходили разные валидации на то к каким полям человек имеет доступ а к каким нет, что может модифицировать а что нет, то есть плитику прав доступа делаю. Чтобы больше не пистаь на клиенте api.getUsers() а писать как будто бы у нас база данных прям в браузере есть. Ну как в Meteor ============== Ребят ну активнее активнее, пожалуйста =) ![]() |
Ну ребята, я даже доку написал, все как вы просили, ну скачайте кто нибудь, протестируйте ну. Ну 0 даунлоадов за сутки ну...
![]() |
Будет custom validation и populate как в mongoose? Можно писать на генераторах с подключенной библиотекой co вместо async/await?
|
ORMjs, ты серьезно на гитхаб закинул после babel?
|
Цитата:
Цитата:
Цитата:
|
Цитата:
Но вообще предполагается что валидация должна делаться на уровне модели. То есть у неё есть методы типа addUser removeMessages и они уже валидируют параметры передаваемые в них и как то сейвят состояние. Максимум что должно быть на слое ORM это как бы длинна данных (чтобы память не жрала 10000к строка например) и какие-то вещи связанные с длинной данных в базе данных и типом, а корректность данных, с точки зрения приложения, должна проверяться самими моделями и прогарммистом отдельно. То есть валидация это уже уровень ИСПОЛЬЗОВАНИЯ ORM а не внутри ORM. Но для удобства я щас добавлю функции $test |
Цитата:
|
Ну а кто вообще пишет на es6 и es7 без Babel? К тому же await это просто сахар на промисы, так что ограничений тут нет =)
(В typescript кстати await например есть) |
Цитата:
/src - тут проект в исходном виде /dist - после бабел gulpfile.js|webpack.config.js - для сборки проекта (или другой сборщик) |
Цитата:
НЕ обязательно разделять сорцы и билды на разные папки, если не предполагается делать сборку. Я не делаю сборку я делаю транспиляцию, сохраняя структуру и имена файлов, по этому для меня удобнее держать сорцы с одном месте с "билдом". > webpack.config.js вебпак нужен когда ты делаешь пак для веба, то есть обьединяешь разные файлы в один. для бакенда это обьединение файлов не нужно, более того, нужно максимально сорцы оставить, чтобы человек если что мог залезть в код модуля твоего и глянуть что там да как. то есть мне в целом сборку не нужно делать для бакенда. Я сборку делаю для фронтенда, вебпаком. Но на node собирать вебпаком это странно. у меня было и src и build но я понял что такая структура папок крайне неудобна и не подходит для моих проджектов. Это имхо. |
Цитата:
|
Цитата:
|
Когда я писал пост, ты еще не ответил.
|
Цитата:
|
Цитата:
babel -d ./dist ./src -s Цитата:
|
cyber,
Почему не нужно чтобы были es6 файлы в npm модуле? Чтобы не увеличивать вес модуля. По этому надо добавить их в npm ignore. 1) Почему на гитхабе не должно быть собранных файлов? нипочему 2) Phpstorm не может делать дебаггинг если они в разных папках лежат 3) Phpstorm красиво подсвечивает скомпилированный файл, он прячет его в сорц файл как бы в папку так, что я всегда, в один клик, могу посмотреть во что оно там скомпилировалось, что повышает удобство разработки. |
А по поводу ORM че думаете? Игрался кто нибудь?) Разве это не самое удобное ORM что вы видели? (осталось только дать индексы настраивать)
|
Цитата:
|
Цитата:
Цитата:
каких даунлоадов ты ждешь? Единственное место где ты опубликовал информацию о своем проекте - этот сайт. Ты знаешь когда люди загружают модули с npm? Когда есть серьезный проект и в разделе установки указано как поставить через npm. В качестве примера HighCharts. У них есть раздел с установкой в документации. Здесь твой пост прочитали от силы 15 человек, которые работают над своими задачами и как минимум твоя тема в данный момент им не нужна. У тебя есть twitter с подписчиками? Твой аккаунт на github с фоткой в трениках, оголенным торсом и ... не вызывает никакого желание у людей даже посмотреть твой проект. А ник из разряда неадекватов. Если ты хочешь чтобы твоей наработкой кто-то пользовался. 1 - (о чем тебе уже лет 9 на этом форуме говорят) стань адекватным человеком. Не веди себя как ребенок в детском саду. 2 - Сделай нормальный twitter, github аккаунты. 3 - Сделай документацию, примеры, сайт(хотя бы github pages) 4 - Россия - это 2% мирового рынка. Успешные проекты ориентированы на глобальный рынок(есть исключения). Есть разные сайты, разделы по интересам где можно добавить ссылку на проект, например сейчас набирает большую популярность https://github.com/sindresorhus/awesome 5 - Научись нормально разговаривать, если ты будешь в том же стили писать на иностранных ресурсах - тебя вежливо будут посылать, игнорить и отправлять в бан. Надеюсь я тебе помог советом. |
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Плюс ко всему я адекватный =) Ты видимо меня с немо путаешь. |
Цитата:
Я сказал что рядом должны лежать исходники до babel П.с Потому что если бы я открыл либу , а там исходники после babel то я бы закрыл и большне не когда бы не юзал бы эту либу. |
ORMjs,
Напишу тебе банальную вещь, которую студенты редко понимают после вуза. Проект - это не куча кода!!! Никого не интересуют мегабайты кода. Всех интересуют проекты. Итак, проект - это 0 - Название проекта. 1 - код, занимает от 50% времени 2 - тестирование 3 - документация!!! 4 - API!!! 5 - примеры(не куски кода на форуме) 6 - Support 7 - сайт 8 - приятный дизайн 9 - Раскрутка 10 - Адекватность(нормальная фотка или логотип всех аккаунтов) 11 - Вежливость, в твоем случаем - не использование гопнического сленга. Можно добавить еще пару десятков пунктов. Добавлю лишь 2. 12 - Когда тебе говорят про Mongo, это значит следующее. На рынке используются множества решений и если твой продукт интегрирован с ними, то ты получаешь +200% потенциальных клиентов(нужно тебе это или нет, решай сам) 13 - Про билды в репозиториях. Если не добавлять билды в .gitignore, то в скором времени при скачивании твоего небольшого проекта в 1 мб, общий размер проекта будет в несколько сотен мб. P.S.: Но прежде чем тратить месяцы-года на разработку, надо для себя определиться что ты в действительности хочешь. 1 - Заработать денег 2 - Просто интересно Думаю в действительности тебе интересен пункт 1. Тогда первым делом смотри какие есть аналоги, цены, популярность. Если пункт 2, то приведу тебе пример моего знакомого - 40 лет, 2-ое детей. 5 лет делал в одного мега-крутую штуку. Серверное решение для обработки видео на одной из технологий Adobe. Потом пришел инвестор с деньгами и сказал что ему надо, и вот уже 7 лет делает неинтересный ему проект но зарабатывает деньги на семью. Крайне редко получается сделать успешный проект, вероятность от 0.1% до 1%. Но при каждой следующей попытки твои шансы увеличиваются. Главное чтобы не получилось вот так - 10 лет потерянной жизни на никому не нужный софт!!! |
Цитата:
Цитата:
|
Цитата:
При каждом build-e плюсом от 20-100 кб (сжатых коммитов библиотеки). После нескольких десятков коммитов... Гляньте хотя бы репозиторий jquery. https://github.com/jquery/jquery Там нет build-ов jquery. Build-ы библиотеки в репозитории - плохой стиль! |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Википедия: Цитата:
Цитата:
|
Цитата:
|
Цитата:
Он постарался сделать чтобы Three.js могли использовать даже плохо знакомые с JS. Постараюсь еще раз объяснить чем это плохо. Если при простом изменении файла - хранятся строки изменений. То с минифицированной версией(представляющей из себя по сути одну строку) в качестве изменения храниться одна строка в несколько десятков килобайт. Если билд делается хотя бы раз в неделю и при среднем размере заархивиронной мин версии библиотеки в 40 кб, получаем за год порядка 1.8 мб. Если же у вас несколько вариаций мин версий то может быть и 10-20 мб за год. |
Цитата:
Если быть честным, так и не понял что конкретно ты делаешь. Но по данной теме понял, что решения связанные с базами данных. Позволь показать тебе реально хороший проект из этой сферы. https://realm.io/ Я не знаю сколько тебе лет, какое образование. Скажу как если бы ты был моим студентом. Ты еще очень много не знаешь, но это не беда. Если хочешь сделать проект - все возможно. Есть проверенный временем подход - MVP. Minimum viable product - минимально жизнеспособный продукт. Большинство молодых разработчиков, хотят сделать что-то большое, но потратив год-два своей жизни бросают это, потом начинают что-то новое и опять повторяется. Необходимо понимать, что у тебя есть - ты один, времени мало, инвестиций нет, но есть цель. Если ты действительно хочешь ее достичь, посчитай сколько тебе надо времени на самую минимальную разработку в часах - не должно быть больше 300 часов. Далее тебе необходимо будет сделать - API, документацию, тесты и множество других моментов о которых ты даже и не думал вначале - это будет еще +100% уже потраченного времени. И вот, прошло пол-года, у тебя есть MVP твоего проекта. Начинается раскрутка. Находи форумы, разделы, twitter group-ы и т.д. которым это может быть интересно и вперед. Но помни успех не приходит сразу, требуется от 1 года, чтобы проект стал пользоваться популярностью. И самое главное - прислушивайся к отзывам, негативное отношение к твоему проекту - это недоработки, которые необходимо исправлять, а не спорить. Ты же не споришь в багами к коде, ты их исправляешь!!! |
Цитата:
Нет уж, любая СУБД - штука комплексная и тяжелая, и какая будет стоять у меня на машине - это как раз-таки моё дело. |
Цитата:
Цитата:
Цитата:
|
Цитата:
В поисковиках на запрос "MegaJS" - ничего нет. Как люди могут узнать что ты хороший специалист, что у тебя проект лучше чем Angular 2? Им необходимо найти твой проект на github без описания и документации https://github.com/uMaxmaxmaximus/ui-js/ и копать исходники? Насколько я понял, тебя звать Иван Вольнов. Ваня, разреши попросить тебя еще раз - смени аватарку у github аккаунта, ну или хотя бы удали. Почему у тебя коммиты на русском языке? Ты только для пользователей стран СНГ делаешь свой проект? P.S.: Опять про твой ник - uMaxmaxmaximus. Ты фанат фильма Гладиатор? Это здорово, но людям это зачем знать? Придумай ник с меньшим количеством символов, например - umax. Тебе нужно работать с речью. Многие IT спецы погруженные в работу говорят на коде. Но ты живешь в сообществе и если ты хочешь что-то донести до людей, то надо выражаться на понятном, приличном языке без сленга. Ты же не хочешь, чтобы тебя все называли Гоп-Инженер или тому подобное. |
Цитата:
Цитата:
У меня есть и стайл и иконка фреймворка, и я уже аккаунт зарегал MegaJsTeam и все такое прочее =) Я фреймворк начну этот писать осенью. Пока же я занимаюсь бизнесом. И просто вам кусочек кода выложил. Вдруг пригодится. Цитата:
Цитата:
Когда я начну делать проджект Mega публичным тогда я все сделаю как положено. ТО что ты говоришь это очевидно, но спасибо все ровно) |
Цитата:
|
Цитата:
fancy, ты пишешь правильные вещи, я с удовольствием их прочитал. Только донести их до ORMjs вряд ли получится (и надо ли оно тебе?). Почему я так думаю? Потому, что Цитата:
|
Цитата:
Если ты хочешь в этой жизни добиться хоть чего-то, а не работать в пиццерии всю жизнь - перечитывай все что я тебе написал до тех пор пока не поймешь. P.S.: Я тебе скажу прямым текстом, раз ты не понимаешь. Нам в фирму нужны люди, но я НИКОГДА не возьму такого как ты, потому что я не смогу с тобой работать и я не хочу постоянно объяснять начальству почему у нас ГОП-Инженер, из-за которого мы теряем клиентов. Надеюсь я достаточно доходчиво объяснил почему тебе надо меняться. Не ждет тебя никакой мега проект и успех, ты просто сопьешься к 35 годам потому что у тебя ничего не будет получаться из-за твоего отношения к людям и жизни. |
Так Максимаксимус уже уходил пару раз с форума.
Всех посылал и уходил. Потом банили его за весьма грубые оскорбления. Снова вернулся? Альтруизм из ушей прет, делиться своим поносом с людьми? :) |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Ну тока тут отличие в том что он очевидности говорит, а боговеры чушь порят. nerv_, то есть тот факт что я писатель а не читатель, не означает что мои взгляды не могут совпадать с егоными. в данном случае они в 100% совпали. Более того, я все намеренно и осознанно перенимаю у других людей, точнее не все а все хорошее, а все плохое (например табу на секс или на мат или на деление на страны) не перенимаю. Я вам уже обьяснял что такое мемы и что 99% населения земли просто рабы матрицы, рабы культуры, рабы мемов. Я человек вне системы, вне матрицы. Я хорошие части хороших мемов беру, плохие части плохих мемов не беру. А вы все подряд берете. И когда я не схавал какой то бессмысленный или плохой мем, вы мне говорите "нууу твоя модель поведения отличается она плохая от того что отличается" чел, это у тебя плохая. все мои отличия это ХОРОГИЕ отличия. Например ругаться матом - ХОРОШО. Нет причимн ТАБУИРОВАТЬ МАТ. Мат это слова о сексе а секс у рабов под табу из за венеричесикх заболеваний в прошлом. Это мем такой которым тебя напискала культура и ты просто выполняешь его программу не думая своей головой. Потому что если бы думал, то ты бы определил что этот мем ошибочен. Так же ты бы определил что и мем оскорблений не верен, так как понижение социального статуса через перечисление социальных недостатков, не понижает социальынй статус, если недостатки не настоящие. и.т.п. ЭТО ВАМ надо учиться у меня потому как я крайне образованный и просветленный человек. А не навязывать сови приметивные, логически не обоснованные и устарелые нормы марали. А вернее не свои а те которые вам матрица в голову вдолбила. Да так вдолбила, что они вам кажутся как будто бы это ВАШИ СВОИ ЛИЧНЫЕ мысли. Ребят, вы не обижайтесь конечно, но не надо сравнивать себя и меня. У нас разные уровни. Лучше либу оцените что я вам подкинул =) |
Часовой пояс GMT +3, время: 19:25. |