Pull to refresh

Поддержка PostgreSQL в Meteor

Reading time 2 min
Views 10K



В популярной платформе для быстрого создания веб-приложений скоро появится официальная поддержка 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 баз данных в будущем.
Tags:
Hubs:
+10
Comments 4
Comments Comments 4

Articles