sequelize создать схему и таблицы схемы - PullRequest
0 голосов
/ 08 мая 2020

во-первых, я вроде как новичок 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! Это не должно быть так сложно найти ...

...