不使用PK

问题描述

我无法在Sequelize(v:6.9.0,PostGres方言)中执行任何类型的upsert或创建。

使用现成的id作为PK,在name字段上具有唯一约束。我已禁用时间戳记,因为我不需要它们,并且upsert在抱怨它们。我尝试过手动定义PK ID,并允许Sequelize神奇地创建它。这是当前的定义:

const schema = {
    name: {
        unique: true,allowNull: false,type: DataTypes.STRING,}
};

class Pet extends Model { }
Pet.define = () => Pet.init(schema,{ sequelize },{ timestamps: false });

Pet.buildCreate = (params) => new Promise((resolve,reject) => {
    let options = {
        defaults: params,where: {
            name: params.name
        },returning: true
    }
    Pet.upsert(options)
        .then((instance) => {
            resolve(instance);
        })
        .catch(e => {
            // message:'Cannot read property 'createdAt' of undefined'
            console.log(`ERROR: ${e.message || e}`);
            reject(e);
        });
});
module.exports = Pet;

Upsert代码

// handled in separate async method,including here for clarity
sequelize.sync();

// later in code,after db sync
Pet.buildCreate({ name: 'Fido' });

在调试中,options看起来正确:

{
    defaults: {
        name: 'Fido'
    },returning:true,where: {
        name: 'Fido'
    }
}

我也尝试过findOrCreatefindCreateFind,它们都返回带有Cannot convert undefined or null to object变体的错误

我尝试在id: null中加入params,结果完全相同。

我成功的唯一方法是在参数中提供PK,但这显然不可扩展。

如何在不提供params PK ID的情况下向上插入Model实例?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)