Статьи

3 JavaScript ORM, которые вы, возможно, не знаете

Когда я писал свои первые строки JavaScript, я никогда не думал, что это выйдет за рамки браузерного скриптинга и создания интерактивных веб-сайтов. Я был неправ, поскольку JavaScript можно использовать буквально везде:

  • Вы можете использовать его в браузере, и вам не нужно ограничиваться ECMAscript с DOM API. Такие языки, как CoffeeScript и Dart , переносимые в обычный старый JavaScript, могут помочь вам быстрее и эффективнее создавать код.
  • Вы можете использовать его на сервере. Node.js и множество его фреймворков растут в количестве и помогают фронт-энду разработчикам становиться разработчиками с полным стеком.
  • Вы можете использовать его для мобильных приложений. Используя Cordova и фреймворки, такие как Ionic или NativeScript , вы можете быстрее создавать мобильные приложения без необходимости знать другие языки, такие как Java или Swift / Objective-C. Благодаря этим фреймворкам вы даже можете делиться исходным кодом между мобильными платформами.
  • Вы можете построить IoT. SitePoint опубликовал несколько статей Патрика Катанзарити, которые могут быть очень полезны для этой цели.

С усложнением разрабатываемого приложения вам понадобится что-то, что поможет вам справиться со всеми данными, хранящимися в базе данных, будь то на сервере БД (например, PostgreSQL), во встроенном SQLite мобильных устройств, или в браузере. Здесь возникает необходимость в ОРМ. В сообществе Java есть Hibernate , разработчики PHP могут использовать Doctrine ORM , а в сообществе JavaScript есть свои собственные ORM.

В этой статье я познакомлю вас с некоторыми JavaScript ORM, которые помогут вам справиться со сложными данными в вашем следующем приложении.

Bookshelf.js

Bookshelf.js — это ORM для Node.js, который хорошо работает с PostgreSQL, MySQL, MariaDB и SQLite3. Он построен на основе построителя запросов Knex SQL и следует некоторым шаблонам, встречающимся в Backbone.js , таким как модели и коллекции и аналогичные соглашения об именах. Если вы когда-либо использовали Backbone, вы, вероятно, очень быстро адаптируете Книжную полку.

Чтобы установить Книжную полку, вам нужно установить Knex, а также драйвер базы данных:

# get knex $ npm install knex --save # get bookshelf $ npm install bookshelf --save # get one of these DB drivers $ npm install pg $ npm install mysql $ npm install mariasql $ npm install sqlite3 

После его установки (обязательно передайте флаг --save чтобы он был добавлен в файл package.json ), вы можете использовать его в своем приложении Node.js следующим образом:

 var knexInstance = require('knex')({ client: 'mysql', // or what DB you're using connection: { host : '127.0.0.1', user : 'scott', password : 'tiger', // Scott's cat name database : 'db_name', charset : 'utf8' } }); // Initialize Bookshelf by passing the Knex instance var bookshelf = require('bookshelf')(knexInstance); var User = bookshelf.Model.extend({ tableName: 'users' }); 

Как видите, объект Книжная полка создается путем передачи экземпляра Knex в качестве параметра. Затем вы можете использовать метод extend() для создания моделей в вашем приложении, точно так же, как модель User для users таблицы в приведенном выше примере. Имейте в виду, что bookshelf является единственным экземпляром Книжной полки, который вы должны использовать в своем приложении. Поэтому лучше сделать его доступным везде в вашем приложении, например, обернуть его в одиночный файл или поместить в другой файл и требовать его при необходимости.

Книжная полка позволяет вам устанавливать отношения один-к-одному, один-ко-многим и многие-ко-многим. В нашем случае это будет что-то вроде:

 var User = bookshelf.Model.extend({ tableName: 'users', posts: function() { return this.hasMany(Post); } }); var Post = bookshelf.Model.extend({ tableName: 'posts', user: function() { return this.belongsTo(User); } }); 

Если вы хотите взглянуть на это, вы можете найти Книжную полку на GitHub .

Sequelize

Sequelize — это еще один ORM для Node.js и io.js (которые, наконец, объединяются ). Он поддерживает PostgreSQL, MySQL, MariaDB, SQLite и MSSQL и обеспечивает надежную поддержку транзакций, отношений, репликации чтения и
Больше. Вы можете установить его, выполнив следующие команды:

 # Install Sequelize $ npm install --save sequelize # Install the DB driver $ npm install --save pg pg-hstore # For both mysql and mariadb dialects $ npm install --save mysql $ npm install --save sqlite3 # MSSQL $ npm install --save tedious 

Теперь вы готовы использовать его, как показано в примере ниже:

 var Sequelize = require('sequelize'); var sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql', // use one of these pool: { max: 5, min: 0, idle: 10000 }, // SQLite only storage: 'path/to/database.sqlite' }); // Or you can simply use a connection uri var sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname'); 

Как и в случае с Bookshelf.js, вам нужно только одно соединение с базой данных. После этого вы можете создать такую ​​модель:

 var User = sequelize.define('user', { firstName: { type: Sequelize.STRING, field: 'first_name' // `first_name` column matches User.firstName }, lastName: { type: Sequelize.STRING } }, { freezeTableName: true // Model tableName (`user`) will be the same as the model name }); 

Вышеуказанный Sequelize.STRING соответствует VARCHAR в SQL. Другие типы данных: Sequelize.INTEGER для INTEGER , Sequelize.BLOB для BLOB (или bytea в Postgres). Вы можете прочитать полный список здесь .

Sequelize позволяет записывать отношения между таблицами . Например, если у вас есть модель с именем Project а другая с именем Developer и вы хотите назначить более одного разработчика одному проекту, вы можете сделать это следующим образом:

 Project.hasMany(Developer, {as: 'devs'}) 

Это обеспечит добавление необходимых полей в каждой модели (в данном случае, в качестве project_id для модели разработчика). Или, если вы чувствуете, что не можете получить прибыль от Sequelize API, вы можете запускать необработанные SQL-запросы .

Sequelize можно найти и на GitHub

Lovefiled

Лавфилд не настоящий ORM. На самом деле это реляционная база данных для веб-приложений, построенная на IndexedDB, разработанная Google и полностью написанная на JavaScript. Он не поддерживает необработанные запросы SQL, но поставляется с API, который пытается имитировать синтаксис SQL.

Вы можете установить его с помощью Bower :

 $ bower install lovefield --save 

или нпм :

 $ npm install lovefield --save 

Добавив его в свой HTML-файл, вы можете начать использовать его в качестве интерфейсной реляционной базы данных. Создать базы данных и таблицы просто:

 // create the database for a `To Do list` var todoDB = lf.schema.create('todo_db', 1); var item = todoDB.createTable('items') .addColumn('id', lf.Type.INTEGER) .addColumn('task', lf.Type.STRING) .addColumn('deadline', lf.Type.DATE_TIME) .addColumn('done', lf.Type.BOOLEAN) .addPrimaryKey(['id']); 

Этот фрагмент кода показывает, как создать базу данных с именем todo_db и таблицу с todo_db items с заданными столбцами ( id как первичный ключ, task , deadline done и done ). На данный момент, чтобы получить список всех незавершенных задач, код будет:

 todoDB.select() .from(item) .where(item.done.eq(false)) .exec(); // exec() returns a Promise 

Код выше очень похож на SQL, где тот же запрос будет:

 SELECT * FROM todo_db.items WHERE done = FALSE; 

Также вы можете сделать заказ, как это:

 todoDB.select() .from(item) .where(item.done.eq(false)) .orderBy(item.deadline, lf.Order.DESC) // order by deadline .exec(); 

Помимо этих простых запросов, Lovefield также может обрабатывать более сложные запросы, такие как объединения. Если у меня есть ссылки в двух таблицах, называемых project и developer (ссылающихся на таблицы projects и developers соответственно), и я хочу просмотреть все проекты данного разработчика, я написал бы:

 db.select() .from(developer, project) .where(lf.op.and( developer.projectId.eq(project.id), developer.id.eq('12345') )) .exec(); // these are both equivalent db.select() .from(developer) .innerJoin(project, developer.projectId.eq(project.id)) .where(developer.id.eq('12345')) .exec(); 

Таким образом, вы можете видеть, что Lovefield действует как слой SQL поверх IndexedDB. Он также поддерживает транзакции ACID (атомарность, согласованность, изоляция, долговечность), ограничение и пропуск (полезно при разбивке на страницы), параметризованные запросы и многое другое.

Как и другие ORM, вы можете скачать Lovefield с GitHub .

Выводы

Знание SQL — это навык, которым должен обладать каждый разработчик, но написание SQL-запросов скучно, особенно когда существует так много ORM. Когда они делают вашу работу проще, почему бы не использовать их в первую очередь? В этой статье я рассмотрел некоторые из наиболее важных выпущенных ORM. Благодаря примерам, приведенным для каждого из них, вы теперь сможете принимать осознанное решение о том, какой из них использовать, а какой соответствует вашим потребностям.

Как насчет тебя? Какой JavaScript ORM вы используете? Прокомментируйте свой выбор ниже.