Sequelize v6 loads models from files under directories

Viewed 1304

In Sequelize v5 or earlier, there is a way to load models from files using sequelize.import function

import Sequelize from 'sequelize';

let sequelize = new Sequelize(...);
let db = {};
arrayOfFiles.forEach(function (file) {
  let model = sequelize['import'](file);
  db[model.name] = model;
});

The sequelize.import method is removed from v6. So how can I do the same thing in Sequelize v6.

2 Answers

you can pass sequelize and DataTypes directly in this case:

const model = require(`./${file}`)(sequelize, Sequelize.DataTypes);

After update from Sequelize v5 to Sequelize v6 I started using the following approach (for MariaDB database):

My db folder contains:

- db:
  - models:
      index.js
      user.js
    index.js

where db/index.js file contains:

const {Sequelize} = require('sequelize');
const {db} = require('../configs');

let connection = null;

const getConnection = () => {
  if (!connection) {
    try {
      connection = new Sequelize(
        db.database,
        db.username,
        db.password,
        db,
      );
    } catch (ex) {
      console.error(__filename, ex);
      process.exit(1);
    }
  }

  return connection;
};

// more code here ...

module.exports = {
  getConnection,
  // more code here ...
};

next db/models/index.js file contains:

const path = require('path');
const fs = require('fs');
const db = require('../index');
const models = {};

module.exports = (() => {
  if (!Object.keys(models).length) {
    const sequelize = db.getConnection();
    const files = fs.readdirSync(__dirname);
    const excludedFiles = ['.', '..', 'index.js'];

    for (const fileName of files) {
      if (!excludedFiles.includes(fileName) && (path.extname(fileName) === '.js')) {
        const modelFile = require(path.join(__dirname, fileName));
        models[modelFile.getTableName()] = modelFile;
      }
    }

    Object
      .values(models)
      .forEach(model => {
        if (typeof model.associate === 'function') {
          model.associate(models);
        }
      });

    models.sequelize = sequelize;
  }

  return models;
})();

and db/models/user.js model file contains:

const {DataTypes} = require('sequelize');
const name = require('path').basename(__filename, '.js');
const sequelize = require('../index').getConnection();

const Model = sequelize.define(name, {
  id: {
    type: DataTypes.UUID,
    defaultValue: DataTypes.UUIDV4,
    allowNull: false,
    primaryKey: true,
    validate: {
      isUUID: 4,
    },
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
}, {
  sequelize,
  tableName: name,
});

Model.associate = models => {
  // your model relations are here
};

module.exports = Model;

After that you will be able to use importing models entirely and anywhere:

const models = require('../db/models');

(async () => {
  const result = await models.user.findAll({
    raw: true
  });

  console.log('result:', result);
})();

Hope it will help!

Related