во-первых, я вроде как новичок ie в sequelize (ORM). Используя его с Postgresql.
У меня есть некоторые модели (пользователи, модули, адаптеры) для схемы publi c и специфические c модели (разрешения, приобретения) для отдельной схемы.
после вставки новой записи в таблицу адаптеров вы хотите создать новую схему и указать c моделей в этой схеме!
import Sequelize from 'sequelize';
import sequelize from '../data/db';
import { hookAfterCreate, hookAfterBulkCreate } from '../controllers/adapter';
import User from './user';
import { adapter as datas } from '../data/seed.json';
const { Model } = Sequelize;
class Adapter extends Model {
static async seed() {
return new Promise((resolve, reject) => {
Adapter.bulkCreate(datas)
.then((resultset) => resultset.map((u) => u.toJSON()))
.then(resolve)
.catch(reject);
});
}
}
Adapter.init(
{
name: {
type: Sequelize.STRING,
allowNull: false,
},
description: {
type: Sequelize.TEXT,
},
ip: {
type: Sequelize.INET,
},
mac: {
type: Sequelize.MACADDR,
},
},
{
sequelize,
hooks: {
afterCreate: hookAfterCreate,
afterBulkCreate: hookAfterBulkCreate
}
}
);
Adapter.Owner = Adapter.belongsTo(User);
export default Adapter;
Я определил ловушку afterCreate в модели, и она отлично работает.
adapterController. js
import sequelize from '../data/db';
export const hookAfterCreate = async (adapter) => {
console.log('afterCreate', adapter.toJSON());
const schemaName = `u${adapter.get('UserId')}a${adapter.id}`;
await sequelize.createSchema(schemaName);
// TODO: ADDING MODELS INTO SCHEMA
};
export const hookAfterBulkCreate = async (adapters) => {
console.log('afterBulkCreate', adapters.length);
Promise
.all(adapters.map(a => hookAfterCreate(a)))
.then(() => {
console.log('afterBulkCreate', 'DONE');
})
.catch((err) => {
console.error('afterBulkCreate', err);
});
};
схема создана!
теперь мне нужно реализовать создание модели.
когда я пытаюсь импортировать модели в файл выше, Я вижу ошибку цикла зависимости в IDE и ошибку ниже в консоли после запуска!
адаптер ["по умолчанию"]. OwnToMany (_module ["по умолчанию"], {^
TypeError : Невозможно прочесть свойство «ownToMany» неопределенного
Папка отдельных моделей отделена от publi c models! Мысленный вызов «require» один раз, но eslint выдает пару ошибок для этого.
Я действительно хочу узнать, как правильно создавать таблицы es в схеме без проблем с отношениями.
Надеюсь, я смог ясно изложить свою проблему! Любая помощь будет принята с благодарностью.
UP UP UPDATE
import Sequelize from 'sequelize';
import sequelize from '../../data/db';
const { Model } = Sequelize;
class Acquire extends Model { }
Acquire.init(
{
expireDate: {
type: Sequelize.DATE,
defaultValue: Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 365
}
},
{
sequelize,
}
);
export default Acquire;
Выше приведено необработанное определение модели для "приобретения"
в методе hookAfterCreate (после комментария TODO), попробуйте что-то вроде того, что показано ниже, создает таблицы во вновь созданной схеме, но нет связи между publi c .modules и a1u1.acquire
logger.info('MODELS SYNCING...');
Acquire.schema(schemaName).belongsTo(Module);
Promise.all(
[ Acquire, Permission ]
.map(model => model.schema(schemaName).sync({ force: true }))
)
.then(() => {
logger.info('MODELS SYNCED!');
})
.catch((err) => {
logger.error(err);
});
Я отказываюсь от ORM! Это не должно быть так сложно найти ...