Sails.js - Postgresql Адаптер нескольких схем
Я много искал возможности многопользовательской аренды Sails.js и знаю, что такая функция еще не реализована. Моей первоначальной идеей было создание мультитенантного приложения путем создания одной базы данных на каждого арендатора.
Поскольку я понял, что в Sails.js я пока не могу этого сделать, я попробовал другой подход, создав только одну базу данных ( POSTGRES), но с множеством схем, каждая из которых представляет арендатора. Моя проблема в том, что я не могу / я не знаю (даже не знаю, возможно ли это в адаптере Sails/Postgres), как динамически (во время выполнения) определить, к какой схеме данный объект должен обратиться аганисту, основываясь на зарегистрированном пользователе.
Кто-нибудь сталкивался с такой проблемой? Как я могу продолжить?
Извините за английский и спасибо.
2 ответа
По моему опыту добавление в модель не работает. Единственное, что сработало для меня, - это использование мета-вызова для определения схемы.
await Users.create(newUser).meta({ schemaName: 'admin' });
Немного громоздко, но это работает.
Надеюсь, это кому-нибудь поможет.
Я думаю, что это вопрос адаптера продолжения ватерлинии, основанный на этом ответе.
Способ сделать это - добавить свойство в модель.
meta: {
schemaName: 'schema'
},
но не работает, вы не можете определить несколько схем, только принимает пользователя как схему, если схема свойств установлена в true в config/models.js, определение схемы для каждой таблицы не работает.
Подсказка находится внутри кода адаптера 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'
}
Когда это будет сделано, вам не нужно добавлять мета ({ schemaName: 'blah'}) ни к одному из запросов. Я боролся с этим пару дней и наконец решил это таким образом.