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

注意:我的OrdersProducts 表确实有一个带有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 表创建了自己的属性,分别为 OrderIdProductId(第一个大写字母;不知道他们为什么以及如何生成名称),因此,我得到了 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:将列类型更改为 ENUM

在 sequelize v6 中包含模型的问题排序 [已解决] - 这不是 sequelize 错误

MySQL 错误 #1054 -“字段列表”中的未知列

错误 #1054 - 尝试将 CSV 文件导入数据库时​​,字段列表中出现未知列

node-sequelize学习笔记二(创建删除表安全检查表表列的数据类型)

Sequelize:按列更新它的旧值