【问题标题】:How to prevent Sequelize adding 'Id' to column name?如何防止 Sequelize 在列名中添加“Id”?
【发布时间】:2016-09-04 16:26:31
【问题描述】:

我发现当我使用 Sequelize 进行查询时,“Id”被添加到列名的末尾,但我不确定如何指示 Sequelize 不要这样做?

我已经为Sequelize创建了一个实体数据模型,如下:

function initializeDataModel(sequelize) {
    var dataModel = { };    

    dataModel.Playlist = this.sequelize.define('playlist', {
        name: Sequelize.STRING,
    }); 

    dataModel.PlaylistEntry = this.sequelize.define('playlist_entry', {
        playlist: {
            name: 'playlist',
            type: Sequelize.INTEGER,
            references: {
                // This is a reference to another model
                model: dataModel.Playlist,

                // This is the column name of the referenced model
                key: 'id'

                // This declares when to check the foreign key constraint. PostgreSQL only.
                //deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE 
            }               
        },
        track: Sequelize.INTEGER
    });                

    dataModel.PlaylistEntry.belongsTo(
         dataModel.Playlist,
         { as: 'Playlist', foreignKey: { name: 'playlist' }});

    dataModel.Playlist.hasMany(dataModel.PlaylistEntry);

    return dataModel;
}    

“playlist_entry”表(在 MariaDB 中)中的字段如下:

  • id:INT(11)
  • 播放列表:INT(11)
  • 轨道:INT(11)

我正在执行的查询如下:

    eagerIncludes.push(this.dataModel.PlaylistEntry);

    this.dataModel.Playlist.find({
       where: { id: playlistId },
       limit: limit,
       offset: offset,
       include: eagerIncludes                 
    }).then(function (results) {
        callback(results, options, undefined);
    }).catch(function (error) {
        callback(undefined, options, error);
    });

这会导致:

ER_BAD_FIELD_ERROR: Unknown column 'playlist_entries.playlistId' in 'field list'

任何建议将不胜感激。更改数据库中的列名不是一种选择。

注意,这是尝试使用“eager includes”时出现的问题。

【问题讨论】:

  • 值得一提的是,Sequelize 添加了Id 来区分作为记录的关系属性和关系键。我不确定您是否可以在不引入严重问题的情况下使用相同的名称。
  • 如果我能够在“playlist_entry”表中将字段名称更改为“playlist_id”,我应该进行哪些更改才能使其正常工作?
  • 通常最好遵守 Sequelize 规定的约定,除非您无法更改架构。如有必要,可以使用选项调整默认值,但您不能做的一件事是让属性和存储它的列具有相同的名称。
  • 我正在使用现有的数据库,并且有一些约定,例如字段和表名都是小写的,并且单词用下划线分隔。我不确定我是否理解您所说的“您不能做的一件事是拥有同名的属性和存储它的列”。这在 Sequelize 中如何表现自己?有什么例子吗?
  • 我的意思是你不能有一个名为x 的列和一个名为x 的属性,因为这两者会发生冲突。这就是为什么它通常是 xIdx_id 的原因,具体取决于您区分它们的键和已实例化的任何相关记录的偏好。

标签: javascript mysql node.js sequelize.js


【解决方案1】:

根据一些实验,解决方法是将“foreignKey”属性添加到 hasMany 定义中:

entities.Playlist.hasMany(entities.PlaylistEntry, { foreignKey: 'playlist' });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2018-03-03
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多