【问题标题】:Creating a new instance that updates others, Sequelize, NodeJs, Express, Postgres创建一个更新其他实例的新实例,Sequelize,NodeJs,Express,Postgres
【发布时间】:2021-11-30 03:16:39
【问题描述】:

我正在使用 Nodejs、Express 和 Sequelize。我有一个名为 Categories 并带有 viewOrder 字段的 Postgres 表:

module.exports = (sequelize, DataTypes) => {
    const Category = sequelize.define(
        'Category',
        {
            name: DataTypes.STRING,
            viewOrder: {
                type: DataTypes.INTEGER,
                allowNull: false,
                unique: true
            }
        },
        {}
    );
    return Category;
};

插入新记录可能会带来问题,因为如果现有记录的视图顺序为 [1, 2, 3, 4, 5],而新记录的顺序视图为 4,那么当前的4要改成5,当前的5要改成6

(我从前端强制这个订单视图是连续的数字)

我猜一个简单的 Category.create 是不够的

更新也可能会出现问题,如果我想将viewOrder为5的记录更改为viewOrder为3,那么视图顺序为3和4的记录也必须与我们正在更新的记录一起更改

如何在 Sequelize 中做到这一点?

提前致谢,

拉斐尔

【问题讨论】:

    标签: node.js postgresql express sequelize.js


    【解决方案1】:

    依靠前端来维护viewOrder 的唯一值是一个糟糕的主意。 Sequelize 也是如此。最可靠的方法是由 PostgreSQL 自己生成这样的唯一值,或者创建一个序列(如果您不需要重用生成的值)或在 Category 表上添加一个触发器。

    【讨论】:

    • 我正在寻找的只是一种通过 sequelize 进行批量增量的方法,例如,所有 viewOrder >= 4 的实例,例如将其递增 1。我想到了循环,但是有没有散装的方式?
    • 而且,这个解决方案必须以相反的顺序工作。使用与前面相同的示例,将 viewOrder >= 4 的所有元素加 1,但从最后一个元素开始,以保​​持唯一性
    • 那你只需要调用 Category.update({ viewOrder: Sequelize.literal('(viewOrder + 1)')}, { where: })
    • 嗨 Anatoly,我输入 Category.update({viewOrder: Sequelize.literal('viewOrder + 1')},{where: {viewOrder: {[Op.gte]: newViewOrder}}}) ;,它告诉我错误:列“vieworder”不存在。这个视图顺序在哪里?
    • 在表格中查看该列的确切命名方式,因为在 Sequelize.literal 中,您应该使用表格中的真实列名,而不是您在模型中定义的列名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多