В популярной платформе для быстрого создания веб-приложений скоро появится официальная поддержка SQL. Ранее разработчики неоднократно отказывались это делать, мотивируя тем, что SQL не вписывается в философию проекта. Однако, настойчивость сообщества сделала своё дело и уже сейчас вы можете попробовать предварительную реализацию поддержки SQL в Meteor. Все подробности — под катом!

Meteor является мощнейшим инструментом для быстрого создания веб приложений, однако отсутствие поддержки SQL резко ограничивает его область применения. Изначально Meteor основан на NoSQL базе MongoDB, которая идеально подходит для реализации таких «фишек» метеора, как компенсация задержки и реактивность. И изначальное отсутствие поддержки SQL в этой идеалогии можно понять, т.к. для её реализации требуется реализовать следующее:
  1. Реализовать SQL базу данных на клиентской стороне и имитировать выполнение всех запросов на клиенте для исключения задержки в работе приложения
  2. Реализовать подписку на запросы, которая осуществляет рассылку изменений клиентам при обновлении в базе данных любых таблиц, указанных в запросе
  3. Синхронизировать клиентскую копию базы с сервером на основании подписок


Эти задачи уже пыталась решить команда Space Elephant www.meteorpostgres.com. На основе их опыта сейчас и реализуется официальная поддержка. Код доступен в репозиториии на GitHub github.com/meteor/postgres-packages. Посмотрев на реализацию, мы имеем следующее:
  1. Для исполнения SQL на клиенте используется Knex knexjs.org, который строит структуру SQL запроса и на основании которого выполняется соотвествующее изменения в клиентской Minimongo
  2. Реализация подписок сделана на основе триггеров github.com/meteor/postgres-packages/tree/master/packages/pg/observe-driver. Т.е. в запросе на основании SQL запроса создаются необходимые триггеры в базе данных, которые с помощью pg_notify отправляют сообщения об изменениях в базе


Вот как будет выглядеть публикация подписки с объединением нескольких таблиц:

Meteor.publish("user-posts-and-their-comments", function(userId) {
    const postsQuery = Posts.knex()
        .select("posts.*")
        .innerJoin("users", "posts.user_id", userId);
    const commentsQuery = Comments.knex()
        .select("comments.*")
        .innerJoin("posts", "comments.post_id", "posts.id")
        .innerJoin("users", "posts.user_id", userId)
    
    return [
        postsQuery,
        commentsQuery
    ]
})

Все примеры разработчики выложили здесь: github.com/meteor/postgres-packages/tree/master/examples

Сейчас разработчики активно совершенствуют поддержку PostgreSQL и добавят поддержку других SQL баз данных в будущем.

Комментарии (4)


  1. gigimon
    24.08.2015 14:15

    Но при этом от использования монги всеравно не уйти, или уже сделали?


  1. x512
    24.08.2015 14:27
    +1

    Пока не до конца, но думаю это дело времени. На клиенте minimongo это не Mongo. Вы можете писать запросы как в sql, а то, что в качестве нижележащего хранилища используется minimongo — это уже детали реализации.


  1. n0ne
    25.08.2015 09:07
    -1

    Уйти, уйти, меня больше интересует совместная работа монги и PostgreSQL