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!