Sails.js — Несколько схем адаптера Postgresql

Я много искал возможности мультитенантности Sails.js и знаю, что такая функция еще не реализована. Моя первоначальная идея состояла в том, чтобы создать мультитенантное приложение, создав одну базу данных для каждого арендатора.

Поскольку я понял, что пока не могу сделать это в Sails.js, я попробовал другой подход, создав только одну базу данных ( POSTGRES ), но с большим количеством схем, каждая из которых представляет арендатора. Моя проблема в том, что я не могу/я не знаю (даже не знаю, возможно ли это в адаптере Sails/Postgres), как динамически (во время выполнения) определить, какую схему данный объект должен запрашивать у аганиста на основе зарегистрированного пользователя.

Кто-нибудь сталкивался с такой проблемой? Как я могу продолжить?

Извините за английский и спасибо.


person Pavarine    schedule 25.08.2015    source источник


Ответы (3)


По моему опыту добавление в модель не работает. Единственное, что сработало для меня, это использование метавызова для указания схемы.

await Users.create(newUser).meta({ schemaName: 'admin' });

Немного громоздко, но работает.

Надеюсь, это поможет кому-то.

person George Bell    schedule 01.06.2018
comment
Я действительно не проверял, потому что я больше не работаю с Sails, но я приму ваш ответ, если кто-то все еще ищет какое-то решение. Спасибо, в любом случае - person Pavarine; 01.06.2018

Я думаю, что это проблема адаптера продолжения водной линии, основанного на этом ответе.

Способ сделать это - добавить свойство в модель

  meta: {
    schemaName: 'schema'
  },

но не работает, вы не можете определить несколько схем, только принимает пользователя как схему, если для схемы свойств установлено значение true в config/models.js, определение схемы для каждой таблицы не работает.

person sebmaldo    schedule 01.09.2015
comment
Sails.js — такой фантастический фреймворк, но поскольку я понял, что не могу разработать настоящее многопользовательское приложение, я был вынужден прекратить работу с ним и переключиться на другой фреймворк. Я думаю, что разработчики Sails.js должны приложить к этому больше усилий. - person Pavarine; 02.09.2015
comment
Я не согласен, это аккуратная структура, но это не просто адаптер базы данных ORM, вы можете заменить ее, если хотите, и это просто сделает ее действительно мощной и декомпозированной. - person sebmaldo; 02.09.2015
comment
Я просто помню эту статью, не существует единой стратегии для разработки многопользовательской архитектуры данных, ссылка - person sebmaldo; 02.09.2015

Подсказка находится внутри кода адаптера sails-postgresql — некоторые из его помощников включают этот бит:

var schemaName = 'public';
    if (inputs.meta && inputs.meta.schemaName) {
      schemaName = inputs.meta.schemaName;
    } else if (inputs.datastore.config && inputs.datastore.config.schemaName) {
      schemaName = inputs.datastore.config.schemaName;
    }

Таким образом, драйвер действительно ищет схему с именем public по умолчанию, если только другое значение не предоставляется через вызовы meta(), как описано выше, ИЛИ имя схемы настроено для всего приложения.

Чтобы настроить имя схемы для всех моделей, необходимо включить свойство schemaName в конфигурацию хранилища данных postgresql, которое находится в datastore.js:

...
default: {
   adapter: 'sails-postgresql',
   url: 'postgresql://username:password@localhost:5432/your_database_name',
   schemaName: 'your_schema_name_here'
}

После этого вам не нужно добавлять meta({ schemaName: 'blah'}) ни к одному из запросов. Я боролся с этим пару дней и, наконец, решил это таким образом.

person Daniel Tofan    schedule 03.10.2019