Sequelize 模型关联不会创建新列

IT技术 javascript node.js sequelize.js
2021-01-27 11:31:25

为什么在我的某些模型中,sequelize 不会为外创建新列但它确实为其他模型创建???这令人沮丧和奇怪。例如,在这个 User 模型中, sequelize 不会创建role_id.

'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: { type: DataTypes.BIGINT, allowNull: false, autoIncrement: true, unique: true, primaryKey: true },
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    User.belongsTo(models.Role, { foreignKey: 'role_id' });
  };
  return User;
};

这是一个类似的问题:Sequelize not created model association columns BUT!它没有得到答复。

我在这上面花了几个小时,我做了以下所有事情:

  1. 彻底阅读:https : //sequelize.org/master/manual/assocs.html
  2. 实验,比如创建一个新的虚拟模型,名称为NewUser有用!但又不是User名字。
  3. 发布在 Sequelize 的 Slack 频道上。

在这个 Stackoverflow 问题之后,我将从他们的 Github 问题页面寻求帮助。

我想我可以只定义列role_id而不是通过associate函数添加它

2个回答

所有模型都应该在一个地方注册,只要它们的协会:

数据库.js

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const db = {}
const models = path.join(__dirname, 'models') // correct it to path where your model files are

const sequelize = new Sequelize(/* your connection settings here */)

fs
  .readdirSync(models)
  .filter(function (file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js')
  })
  .forEach(function (file) {
    // Sequelize version <= 5.x
    var model = sequelize['import'](path.join(models, file))
    // Sequelize version >= 6.x
    // var model = require(path.join(models, file))(
    //   sequelize,
    //   Sequelize.DataTypes
    // );
    db[model.name] = model;
  })

Object.keys(db).forEach(function (modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})

db.Sequelize = Sequelize // for accessing static props and functions like Op.or
db.sequelize = sequelize // for accessing connection props and functions like 'query' or 'transaction'

module.exports = db

some_module.js

const db = require('../database')
...
const users = await db.user
   .findAll({
     where: {
      [db.Sequelize.Op.or]: [{
        first_name: 'Smith'
      }, {
        last_name: 'Smith'
      }]
     }
})

@Anatoly 同时我浏览了一些类似的帖子。我试图合并这些。但是一些小错误阻止了我。您有什么建议可以参考任何完整的示例代码吗?
2021-03-13 11:31:25
@Anatoly 我能看到 TypeError: sequelize.import is not a function
2021-03-16 11:31:25
basename变量从何而来?
2021-03-18 11:31:25
谢谢,阿纳托利。但我认为我在做正确的事情,因为这个注册的东西也是由 Sequelize 生成的!解决方案实际上是在db.sync.
2021-03-31 11:31:25
var basename = path.basename(module.filename)
2021-03-31 11:31:25

感谢 Anatoly 像这样回答我关于 Sequelize 的问题。

经过这么多次试验和错误,我认为问题是由我的路线注册引起的,例如:

require("./app/routes/user/user.routes")(app)

在我的app.jsserver.js 中这些路由注册是在db.sync!

所以我所做的是,之后我将这些路由称为注册db.sync,如下所示:

const db = require("./app/models")

if (process.env.NODE_ENV === "production") {
  db.sequelize.sync().then(() => {
    useRoutes()
  })
} else {
  db.sequelize.sync({ force: true }).then(() => {
    console.log("Drop and re-sync db.")
    useRoutes()
  })
}

function useRoutes() {
  console.log("Use routes...")
  require("./app/routes/user/user.routes")(app)
  require("./app/routes/auth/auth.routes")(app)
}

瞧,固定!