Когда я писал свои первые строки 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:[email protected]: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 вы используете? Прокомментируйте свой выбор ниже.