Sequelize尝试将数据输入未知列[Postgres]

时间:2018-02-25 13:08:48

标签: javascript node.js postgresql orm sequelize.js

这是我的查询失败:

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'),
};

以下是模型文件:

模型/ OrdersProducts.js

module.exports = (sequelize, DataTypes) => {
  const OrdersProducts = sequelize.define('OrdersProducts', {
    orderId: DataTypes.INTEGER,
    productId: DataTypes.INTEGER,
  }, {});
  return OrdersProducts;
};

模型/ 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;
};

模型/ 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 个答案:

答案 0 :(得分:0)

怪异。

N.B。我在查询中使用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 < / strong>(首字母大写; 不知道为什么以及如何生成名称)因此,我得到了 OrderId 啄。

如果我从belongToMany模型中删除了Orders关联,我就会改为使用ProductId列获得相同的错误。

最后,我发现the accepted answer here在某种程度上告诉我使用关联提供的列并删除OrdersProducts列中的相应列。

现在我的查询工作正常BTW ,如下所示:

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;
};

关于自动列命名的谜团仍然存在。

P.S。这是最奇怪的部分。

现在我有一张表Users,因为您可以从上面的代码中看到。注意belongsTo在模型中的运作方式。

模型/ users.js

module.exports = (sequelize, DataTypes) => {
  const Users = sequelize.define('Users', {
    name: DataTypes.STRING,
  }, {});
  Users.associate = function (models) {
    Users.hasMany(models.Orders);
  };
  return Users;
};

模型/ 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添加一个条目(看看它是如何不要求我从{{1}删除userId列的它也没有提出自己的Orders -_-):

UserId

模型/ users.js

Models.Users.create({
  name: 'Aakash',
});
Models.Orders.create({
  userId: 1,
});

模型/ orders.js

module.exports = (sequelize, DataTypes) => {
  const Users = sequelize.define('Users', {
    name: DataTypes.STRING,
  }, {});
  Users.associate = function (models) {
    Users.hasMany(models.Orders);
  };
  return Users;
};