Создать новую модель в Sequelize без модели: сгенерировать? - PullRequest
0 голосов
/ 06 мая 2020

Ничего страшного, если я сделаю модели из копипаста? Например, я сделал свою первую модель от User до Sequelize's model:generate. А для других моделей я просто скопировал все из модели User в свои новые модели.

При выполнении db syn c:

db.sequelize.sync({ force : true}).then(() => {
  console.log("Drop and re-sync db.")
})

Новые модели не будут создавать новые таблицы. Я думаю, что копирование для новых моделей не сработает. Правильно?

Модель пользователя:

'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: { type: DataTypes.BIGINT, allowNull: false, unique: true, primaryKey: true },
    fbid: { type: DataTypes.BIGINT, allowNull: false, unique: true },
    email: DataTypes.STRING,
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    photo_url: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    // associations can be defined here
  };
  return User;
};

И сгенерировано из копипаста + модификации модели пользователя, у меня есть: Модель страны

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Country = sequelize.define('Country', {
    country_name: DataTypes.STRING
  }, {});
  Country.associate = function(models) {
    // associations can be defined here
  };
  return Country;
};

Индекс. js сгенерировано cli в моих моделях:

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Затем после сгенерированных моделей, после выполнения model:generate Я перенес сгенерированный User. js в папку User. Затем выполните копирование и вставку, не зная, повлияет ли перемещение файлов на регистрацию моделей, созданных мной путем копирования и вставки.

enter image description here

1 Ответ

0 голосов
/ 10 мая 2020

Основываясь на комментариях выше, я понял, что мой файл index.js (сгенерированный Sequelize) не искал файлы модели, помещенные во вложенные папки. Вместо этого он ищет ТОЛЬКО файлы модели, которые находятся в папке root - на том же уровне, что и файл index.js.

Итак, я разместил этот вопрос: Javascript получить все файлы в папка, которая находится внутри другого сгиба

Мне пришлось использовать пакет glob, чтобы файл index.js тоже искал вложенные папки.

Итак, мой index.js контент сейчас:

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config')[env];
const db = {};
const glob = require("glob")

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

const files = glob.sync(__dirname + "/*/*.js")

files.forEach(file => {
  const model = sequelize['import'](file);
  db[model.name] = model;
})

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Чтобы ответить на конкретный c вопрос, НЕТ. Мне не нужно все время выполнять команды. Вместо этого я могу копировать-вставлять-редактировать новые модели.

...