Sequelize 不会自动创建外键,并在“fieldset”中抛出“no column”userId”错误。我尝试在下面提供所有信息。由于我的代码是 100% 正确的,因此我完全不知道该从哪里开始。 (阅读下文)
所以我有一个产品和用户模型。之前两者都工作正常。我添加了一些代码来建立关系:
Product.belongsTo(User, { constraints: true, onUpdate: "CASCADE" });
User.hasMany(Product);
我也在同步数据库时使用了 {force: true} 并在刷新表后将其删除。我试过在这些步骤之后重新启动电脑,重新启动工作台,创建一个新数据库并更改连接以连接到新数据库,但它仍然没有在我的产品架构中放置“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% 连接的,因为我的数据库中的表发生了事情,只是续集应该从我的关联自动生成的“userId”列没有出现。
还尝试在我的 Product.belongsTo() 代码行中放入外键:“userId”以尝试隐式设置它。那甚至没有用。 因此我卡住了,无法继续使用我的 sql 代码。
Github repo 如果需要更多代码: https://github.com/NinjaInShade/online-shop
答案 0 :(得分:1)
我对您的代码进行了一些关于关联和外键的修改,您有两种方法可以创建列 userId
和外键:
userId
选项将 Product
字段定义添加到 references
模型,如下所示: userId: {
allowNull: true,
type: Sequelize.INTEGER,
references: {
model: 'users',
key: 'id'
}
}
sync
方法单独同步模型:User.sync({ force: true })
.then(() => {
Product.sync({ force: true }).then(() => {
app.listen(5000);
})
})
遗憾的是,官方文档没有说明为什么 sync
中的 Sequelize
方法与单独模型的 sync
相比具有不同的作用。
通常我使用迁移,这就是为什么我没有这个问题。