Sequelize 尝试将数据输入未知列 [Postgres]
Posted
技术标签:
【中文标题】Sequelize 尝试将数据输入未知列 [Postgres]【英文标题】:Sequelize trying to enter data into an unknown column [Postgres] 【发布时间】:2018-02-25 13:08:47 【问题描述】:这是我失败的查询:
Models.OrdersProducts.create(
orderId: 1,
productId: 1,
);
出现错误:
Executing (default): INSERT INTO "OrdersProducts" ("orderId","productId","createdAt","updatedAt","OrderId") VALUES (1,1,'2018-02-25 12:51:00.110 +00:00
','2018-02-25 12:51:00.110 +00:00',NULL) RETURNING *;
Unhandled rejection SequelizeDatabaseError: column "OrderId" of relation "OrdersProducts" does not exist
at Query.formatError (/Users/aakashverma/Documents/sequelize-join-table/node_modules/sequelize/lib/dialects/postgres/query.js:363:16)
我的表没有列OrderId
(大写O),只有orderId
注意:我的Orders
和Products
表确实有一个带有id
1 的条目,这不是问题。
这是我对OrdersProducts
的迁移:
module.exports =
up: (queryInterface, Sequelize) => queryInterface.createTable('OrdersProducts',
id:
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
,
orderId:
type: Sequelize.INTEGER,
references:
model: 'Orders',
key: 'id',
,
,
productId:
type: Sequelize.INTEGER,
references:
model: 'Products',
key: 'id',
,
,
createdAt:
allowNull: false,
type: Sequelize.DATE,
,
updatedAt:
allowNull: false,
type: Sequelize.DATE,
,
),
down: (queryInterface, Sequelize) => queryInterface.dropTable('OrdersProducts'),
;
这里是模型文件:
models/OrdersProducts.js
module.exports = (sequelize, DataTypes) =>
const OrdersProducts = sequelize.define('OrdersProducts',
orderId: DataTypes.INTEGER,
productId: DataTypes.INTEGER,
, );
return OrdersProducts;
;
models/Orders.js
module.exports = (sequelize, DataTypes) =>
const Orders = sequelize.define('Orders',
userId: DataTypes.INTEGER,
, );
Orders.associate = function (models)
Orders.belongsTo(models.Users);
Orders.belongsToMany(models.Products, through: 'OrdersProducts', as: 'product' );
;
return Orders;
;
models/Products.js
module.exports = (sequelize, DataTypes) =>
const Products = sequelize.define('Products',
name: DataTypes.TEXT,
, );
Products.associate = function (models)
Products.belongsToMany(models.Orders, through: 'OrdersProducts', as: 'order' );
;
return Products;
;
【问题讨论】:
【参考方案1】:很奇怪。
注意我在查询中使用 1 作为 id,因为这是自动增量 id
键值,因为我只在任何表中添加一个条目。
看看我的Orders
模型:
module.exports = (sequelize, DataTypes) =>
const Orders = sequelize.define('Orders',
userId: DataTypes.INTEGER,
, );
Orders.associate = function (models)
Orders.belongsTo(models.Users);
Orders.belongsToMany(models.Products, through: 'OrdersProducts', as: 'product' );
;
return Orders;
;
还有我的Products
型号:
module.exports = (sequelize, DataTypes) =>
const Products = sequelize.define('Products',
name: DataTypes.TEXT,
, );
Products.associate = function (models)
Products.belongsToMany(models.Orders, through: 'OrdersProducts', as: 'order' );
;
return Products;
;
这两个似乎为我的OrdersProducts
表创建了自己的属性,分别为 OrderId
和 ProductId
(第一个大写字母;不知道他们为什么以及如何生成名称),因此,我得到了 OrderId
的东西。
如果我从Orders
模型中删除belongToMany
关联,我会看到ProductId
列出现相同的错误。
最后,我找到了the accepted answer here,它在某种程度上告诉我使用关联提供的列并将对应的列放入OrdersProducts
列中。
现在我的查询,顺便说一句效果很好,看起来像:
const Models = require('./models');
// Models.Users.create(
// name: 'Aakash',
// );
// Models.Orders.create(
// userId: 1,
// );
// Models.Products.create(
// name: 'lash',
// );
Models.OrdersProducts.create(
OrderId: 1,
ProductId: 1,
);
模型看起来像(再次注意大写字母):
module.exports = (sequelize, DataTypes) =>
const OrdersProducts = sequelize.define('OrdersProducts',
OrderId: DataTypes.INTEGER,
ProductId: DataTypes.INTEGER,
, );
return OrdersProducts;
;
关于自动列命名的谜团仍然存在。
附:这是最奇怪的部分。
现在我有一个表格Users
,正如您从我上面的代码中看到的那样。注意belongsTo
在模型中的作用。
models/users.js
module.exports = (sequelize, DataTypes) =>
const Users = sequelize.define('Users',
name: DataTypes.STRING,
, );
Users.associate = function (models)
Users.hasMany(models.Orders);
;
return Users;
;
models/orders.js
module.exports = (sequelize, DataTypes) =>
const Orders = sequelize.define('Orders',
userId: DataTypes.INTEGER,
, );
Orders.associate = function (models)
Orders.belongsTo(models.Users);
Orders.belongsToMany(models.Products, through: 'OrdersProducts', as: 'product' );
;
return Orders;
;
下面的查询仍然有效并向Orders
添加一个条目(看看它如何不需要我从Orders
表中删除userId
列,也不会出现有自己的UserId
-_-):
Models.Users.create(
name: 'Aakash',
);
Models.Orders.create(
userId: 1,
);
models/users.js
module.exports = (sequelize, DataTypes) =>
const Users = sequelize.define('Users',
name: DataTypes.STRING,
, );
Users.associate = function (models)
Users.hasMany(models.Orders);
;
return Users;
;
models/orders.js
module.exports = (sequelize, DataTypes) =>
const Orders = sequelize.define('Orders',
userId: DataTypes.INTEGER,
, );
Orders.associate = function (models)
Orders.belongsTo(models.Users);
Orders.belongsToMany(models.Products, through: 'OrdersProducts', as: 'product' );
;
return Orders;
;
【讨论】:
类似问题,有更新吗?以上是关于Sequelize 尝试将数据输入未知列 [Postgres]的主要内容,如果未能解决你的问题,请参考以下文章
在 sequelize v6 中包含模型的问题排序 [已解决] - 这不是 sequelize 错误
错误 #1054 - 尝试将 CSV 文件导入数据库时,字段列表中出现未知列