javascript 为什么sequize将OID属性转换为'o_i_d'?

ac1kyiln  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(143)

我尝试创建新实体"OrderInfo",但在请求sql时将OID属性转换为o_i_d
订单信息类:

const { Model, DataTypes } = require('sequelize');
const sequelize = require('../db/db');

class OrderInfo extends Model {}

OrderInfo.init({
  OID: {
    type: DataTypes.INTEGER,
    primaryKey: true,
  },
  id_client: {
    type: DataTypes.INTEGER,
    allowNull: false,
  },
  id_commande: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  date: {
    type: DataTypes.STRING,
    allowNull: false,
  },
}, {
  sequelize,
  createdAt: 'date',
  tableName: 'commande_info',
});

module.exports = OrderInfo;
addOrderToOrderInfo: async (idClient, idCommande) => {
    const newOrderInfo = await OrderInfo.create({
      id_client: idClient,
      id_commande: idCommande,
      date: `${new Date()}`,
    });

序列化错误:

code: 'ER_BAD_FIELD_ERROR',
    errno: 1054,
    sqlState: '42S22',
    sqlMessage: "Unknown column 'o_i_d' in 'field list'",
    sql: 'INSERT INTO `commande_info` (`o_i_d`,`id_client`,`id_commande`,`date`,`updated_at`) VALUES (?,?,?,?,?);',

我已经尝试改变OID到oid和当我这样做Sequelize请求'oid'同意,但如果我这样做,我需要更新我的数据库和我所有的其他程序

gcuhipw9

gcuhipw91#

我猜应该是大写字母。试试下面这个:

oid: {
  type: DataTypes.INTEGER,
  primaryKey: true,
},

你可以通过改变下面的例子来验证这一点,如果我是对的,它应该会继续工作:

oid: {
  ...
},
idClient: {
  ...
},
idCommande: {
  ...
},

ORM/mapper通常会应用以下规则:

  • 小写首字符
  • 替换[下划线+小写版本]的每个大写字母
  • 第一个月第一次-〉第一个月第一次-〉第一个月第二次
  • x1个月3个月1x-〉x1个月4个月1x-〉x1个月5个月1x
  • x1个月6个月1x-〉x1个月7个月1x-〉x1个月8个月1x

通常这样做是因为camelCase更容易阅读,但数据库定义几乎总是小写和snake_cased。

mrzz3bfm

mrzz3bfm2#

有趣的是,我不能仅仅通过使用一个简单的sqlite连接和上面的代码来复制这个。也许在配置模块中有一些东西?
但是-对于旧版表,存在:
https://sequelize.org/docs/v6/other-topics/legacy/#fields
所以

OID: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      field: "OID",
    },

就能成功。

相关问题