Sequelize 关联不生成外键

Sequelize associations not generating foreign key

Sequelize 没有自动创建外键,并抛出“fieldset”中没有列“userId””错误。我尝试在下面提供所有信息。由于我的代码是 100% 正确的,所以我完全不知道从哪里开始。 (阅读下文)

所以我有一个产品和用户模型。两者之前都工作正常。我添加了一些代码来建立关系:

Product.belongsTo(User, { constraints: true, onUpdate: "CASCADE" });
User.hasMany(Product);

我也在同步数据库时使用了 {force: true} 并在刷新表后将其删除。我尝试在这些步骤后重新启动电脑,重新启动 workbench,创建一个新数据库并更改连接以连接到新数据库,但它仍然没有在我的产品架构中放置“userId”列。

到目前为止,我已经让两个人检查了这段代码,他们确认我的语法没有问题,但同样感到困惑。我也相信自己这不是错误的,因为我正在学习一个有信誉的课程,我现在不得不复制并粘贴他的代码来替换我的代码以防万一,但没有用。

产品型号:

const Sequelize = require("sequelize");

const sequelize = require("../util/database");

const Product = sequelize.define("product", {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true,
  },
  title: Sequelize.STRING,
  price: {
    type: Sequelize.DOUBLE,
    allowNull: false,
  },
  image_url: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  description: {
    type: Sequelize.STRING,
    allowNull: false,
  },
});

module.exports = Product;

用户模型:

const Sequelize = require("sequelize");

const sequelize = require("../util/database");

const User = sequelize.define("user", {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true,
  },
  name: Sequelize.STRING,
  email: Sequelize.STRING,
});

module.exports = User;

正在同步代码(我创建了一个测试用户,因为课程正处于我们正在测试的阶段,我们可以创建一个):

// db.sync({ force: true })
db.sync()
  .then((result) => {
    return User.findByPk(1);
    // console.log(result);
  })
  .then((user) => {
    if (!user) {
      return User.create({ name: "Max", email: "test@test.com" });
    }
    return user;
  })
  .then((user) => {
    app.listen(5000);
  })
  .catch((err) => {
    console.log(err);
  });

连接是 100% 连接,因为我的数据库中的表发生了一些事情,只是 sequelize 应该从我的关联中自动生成的“userId”列没有出现。

也曾尝试在我的 Product.belongsTo() 代码行中放入一个 foreignKey: "userId" 以尝试隐式设置它。那甚至没有用。 因此我卡住了,无法继续我的 sql 代码。

Github repo 如果需要更多代码: https://github.com/NinjaInShade/online-shop

我尝试了你的代码,对关联和外键进行了一些修改,你有两种方法来创建列 userId 和外键:

  1. 使用 references 选项向 Product 模型添加 userId 字段定义,如下所示:
  userId: {
    allowNull: true,
    type: Sequelize.INTEGER,
    references: {
      model: 'users',
      key: 'id'
    }
  }
  1. 使用 sync 方法单独同步模型:
User.sync({ force: true })
.then(() => {
  Product.sync({ force: true }).then(() => {
    app.listen(5000);
  })
})

不幸的是,官方文档没有阐明为什么 Sequelize 中的 sync 方法与单独模型的 sync 相比表现不同。

通常我使用迁移,这就是为什么我没有这个问题。