1.0.3 • Published 1 year ago

skutil-sequelize v1.0.3

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

Sequelize utils used by the author privately.

Install

yarn add skutil-sequelize

Usage

Suppose the ./models dir contains model definition files like:

// ./models/user.js

const { Model, DataTypes } = require('sequelize')

module.exports = function(sequelize) {
  class User extends Model {}
  User.init({
    username: { type: DataTypes.STRING(30), unique: 'username', allowNull: false },
    password: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
    nickname: { type: DataTypes.STRING, allowNull: false, defaultValue: 'Alice' },
    roleId: { type: DataTypes.INTEGER, allowNull: false }
  }, {
    sequelize,
    tableName: 'user',
    timestamps: true
  })
  return User
}

You can also define a dynamic model, which can be used to split the table:

// ./models/leaderboard.js

const { Model, DataTypes } = require('sequelize')

class ModelCreator {
  constructor() {
    this.isDynamic = true
    this.modelPrefix = 'LeaderBoard'
    this.tablePrefix = 'leaderboard'
  }

  createModel(sequelize, postfix) {
    postfix = postfix || ''
    const modelName = this.modelPrefix + postfix
    const tableName = this.tablePrefix + ((postfix.length > 0) ? ('_' + postfix) : '')

    class LeaderBoard extends Model {
      static associate(models) {
        models.User.hasOne(LeaderBoard, {
          sourceKey: 'id',
          foreignKey: { name: 'userId', allowNull: false },
          as: `lb_${postfix}`
        })
        LeaderBoard.belongsTo(models.User, {
          targetKey: 'id',
          foreignKey: { name: 'userId', allowNull: false },
          as: 'user'
        })
      }
    }

    LeaderBoard.init({
      score: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }
    }, {
      sequelize,
      modelName,
      tableName,
      timestamps: true
    })
    LeaderBoard.associate(sequelize.models)
    return LeaderBoard
  }
}
module.exports = new ModelCreator()

We can load all the models with this module:

const { Database } = require('skutil-sequelize')
const db = new Database()
db.init({
  dialect: 'mysql',
  host: '127.0.0.1',
  port: 3306,
  username: 'yourun',
  password: 'yourpwd',
  database: 'yourdb',
  logging: (process.env.DEBUG_DB === 'true') ? msg => console.debug(msg) : false
})
db.loadModels('./models', { root: __dirname })

const sequelize = db.sequelize
const models = sequelize.models
const { User } = models
const LeaderBoard = await db.getDynamicModel('LeaderBoard', '202211')
const records = await Leaderboard.findAll()

ChangeLog

  • 1.0.2 去除skutil依赖, README写点基本用法
1.0.2

2 years ago

1.0.3

1 year ago

1.0.1

2 years ago

1.0.0

2 years ago