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

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

这是模型文件:

模型/订单Products.js
module.exports = (sequelize, DataTypes) => {
  const OrdersProducts = sequelize.define('OrdersProducts', {
    orderId: DataTypes.INTEGER,
    productId: DataTypes.INTEGER,
  }, {});
  return OrdersProducts;
};

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

模型/产品.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 作为 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 东西。

如果我从 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;
};

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

附言这是最奇怪的部分。

现在我有一个表 Users,正如您从上面的代码中看到的那样。注意 belongsTo 在模型中的作用。

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

模型/订单.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 添加了一个条目(看看它如何不需要我从 userId 表中删除 Orders 列,也没有提出自己的 UserId -_-):
Models.Users.create({
  name: 'Aakash',
});
Models.Orders.create({
  userId: 1,
});

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

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

关于javascript - Sequelize 尝试将数据输入到未知列 [Postgres],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48973789/

相关文章:

javascript - 转换 YYYY-MM-DD HH :MM:SS to different format in Javascript

node.js - 更新 NVM Node 版本管理器 creationix 版本

javascript - Socket.io 数组访问

node.js - 在工作实例之间以最小重叠分配主题

postgresql:如何在 session 中存储id

javascript - 如何让这两个div的高度相同?

javascript - 为什么我的 ExtJS 网格中的按钮显示为 "[object Object]"?

javascript - JQuery Mobile Listview 滑动菜单

sql - 如何搜索整个单词是否存在于 Postgres 的字符串中

postgresql - PostGIS 转换问题