如何在 Sequelize 模型中定义索引?

Posted

技术标签:

【中文标题】如何在 Sequelize 模型中定义索引?【英文标题】:How to define an index, within a Sequelize model? 【发布时间】:2019-05-25 13:42:01 【问题描述】:

我正在尝试在 Sequelize 模型中为我的一个 SQL 列创建一个简单的非唯一索引。我试着关注这个帖子:How to define unique index on multiple columns in sequelize。

这是我的代码:

module.exports = (sequelize, DataTypes) => 
    const Item = sequelize.define('Item', 
        itemId:  DataTypes.STRING,
        ownerId:  DataTypes.INTEGER,
        status: DataTypes.STRING,
        type: DataTypes.STRING,
        nature: DataTypes.STRING,
        content: DataTypes.STRING,
        moment: DataTypes.BIGINT,
        indexes:[
            
                unique: 'false',
                fields:['ownerId']
            
        ]

    );

    return Item;
;

我收到此错误:

未处理的拒绝 SequelizeDatabaseError:您的文件中有错误 SQL 语法;检查与您的 MariaDB 服务器相对应的手册 在 '[object Object], createdAt 附近使用正确语法的版本 DATETIME NOT NULL, updatedAt DATETIME NOT NULL, P' 在第 1 行

我在 server.js 文件中的代码是这样的:

models.sequelize.sync().then(function () 
    server.listen(port, () => 
        console.log('server ready')
    )
);

我的设置有什么问题?有没有其他方法可以用 Sequelize 完成?

【问题讨论】:

【参考方案1】:

差不多了。您应该像这样在新对象中添加索引:

module.exports = (sequelize, DataTypes) => 
    const Item = sequelize.define('Item', 
        itemId:  DataTypes.STRING,
        ownerId:  DataTypes.INTEGER,
        status: DataTypes.STRING,
        type: DataTypes.STRING,
        nature: DataTypes.STRING,
        content: DataTypes.STRING,
        moment: DataTypes.BIGINT
    ,
    
      indexes:[
       
         unique: false,
         fields:['ownerId']
       
      ]
    );

    return Item;
;

【讨论】:

呵呵。如果这解决了这个问题,那么请接受我的回答:) 我会在 4 分钟内,如果它允许我这样做:D @Roi 是否需要是表中的实际字段或代码定义中提到的字段名称 @Root 我不确定你的意思。插入到 fields 数组中的字段名称对应于 Item 模型中的字段之一。如果我错了,请纠正我,但这些名称也将始终反映数据库表中字段的名称。 @Roi 假设有一个模型定义的列为 ItemId: type: DataTypes.BIGINT, field: 'item_id', autoIncrement: true 在这个索引应该是什么? ItemId 或 item_id【参考方案2】:

它也可以在单个迁移中工作。

在我的情况下,只需在迁移文件中的 createTable 方法之后执行 addIndex

迁移:

return queryInterface.createTable('Item', 
    // columns...
).then(() => queryInterface.addIndex('Item', ['OwnerId']))
.then(() => 
    // perform further operations if needed
);

迁移文件对我有用。

【讨论】:

以上是关于如何在 Sequelize 模型中定义索引?的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize js如何获取关联模型的平均值(聚合)

从已经定义的模型中获取 Sequelize.js ENUM 值

如何在 Sequelize 中的导入模型中创建自定义方法或函数

在 Sequelize 中定义模型的不同方法

如何扩展 Sequelize 模型?

如何使用 Sequelize-Typescript 模型定义指定 NestJs 控制器的返回类型?