Sequelize:如何使用指定的列重复项进行更新
Sequelize: How to upsert with specified column duplicates
如果具有指定列名的记录不匹配或不存在,我想创建新记录,否则更新它。
我有一个名为 AssignedDownloadRoute
的模型,并且这样定义它
AssignedDownloadRoute.init(
{
assigned_download_route_id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
},
route_code: {
type: DataTypes.STRING,
allowNull: false,
},
assigned_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
assigner_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
reading_period: {
type: DataTypes.STRING,
allowNull: false,
},
created_modified: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
}
},
{
sequelize: DBInstance,
modelName: 'AssignedDownloadRoute',
tableName: 'assigned_download_route',
timestamps: false,
}
);
假设我有要插入的数据,但是一旦我已经插入它,它就不应创建新记录,而是 updates/overwrites 它。
const bulkData = [
{
route_code: '123',
assigned_user_id: 3,
assigner_user_id: 26,
reading_period: '202105',
created_modified: '2021-06-11 06:36:20'
},
{
route_code: '456',
assigned_user_id: 4,
assigner_user_id: 32,
reading_period: '202105',
created_modified: '2021-06-11 06:36:20'
}
]
当我尝试 运行 bulkCreate
和 updateOnDuplicate
选项时,它不会更新现有记录,而是创建新记录。如果列名 route_code
matched/already 存在,我希望现有数据仅更新 assigned_user_id
和 assigner_user_id
。
AssignedDownloadRoute.bulkCreate(bulkData, {
updateOnDuplicate: ['assigned_user_id', 'assigner_user_id'],
});
您的模型中似乎只有一个字段符合唯一条件 (assigned_download_route_id
),因为它被定义为主键。由于该值不包含在您的有效载荷中,因此每个有效载荷没有什么独特之处。如果您希望 route_code
成为唯一值,则必须在您的模型中使用 unique: true
选项相应地定义它。
AssignedDownloadRoute.init(
{
assigned_download_route_id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
},
route_code: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
assigned_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
assigner_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
reading_period: {
type: DataTypes.STRING,
allowNull: false,
},
created_modified: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
}
},
{
sequelize: DBInstance,
modelName: 'AssignedDownloadRoute',
tableName: 'assigned_download_route',
timestamps: false,
}
);
有关 Models
选项的更多详细信息以及更复杂的唯一键定义(例如复合键),请阅读此处:https://sequelize.org/master/manual/model-basics.html
如果具有指定列名的记录不匹配或不存在,我想创建新记录,否则更新它。
我有一个名为 AssignedDownloadRoute
的模型,并且这样定义它
AssignedDownloadRoute.init(
{
assigned_download_route_id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
},
route_code: {
type: DataTypes.STRING,
allowNull: false,
},
assigned_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
assigner_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
reading_period: {
type: DataTypes.STRING,
allowNull: false,
},
created_modified: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
}
},
{
sequelize: DBInstance,
modelName: 'AssignedDownloadRoute',
tableName: 'assigned_download_route',
timestamps: false,
}
);
假设我有要插入的数据,但是一旦我已经插入它,它就不应创建新记录,而是 updates/overwrites 它。
const bulkData = [
{
route_code: '123',
assigned_user_id: 3,
assigner_user_id: 26,
reading_period: '202105',
created_modified: '2021-06-11 06:36:20'
},
{
route_code: '456',
assigned_user_id: 4,
assigner_user_id: 32,
reading_period: '202105',
created_modified: '2021-06-11 06:36:20'
}
]
当我尝试 运行 bulkCreate
和 updateOnDuplicate
选项时,它不会更新现有记录,而是创建新记录。如果列名 route_code
matched/already 存在,我希望现有数据仅更新 assigned_user_id
和 assigner_user_id
。
AssignedDownloadRoute.bulkCreate(bulkData, {
updateOnDuplicate: ['assigned_user_id', 'assigner_user_id'],
});
您的模型中似乎只有一个字段符合唯一条件 (assigned_download_route_id
),因为它被定义为主键。由于该值不包含在您的有效载荷中,因此每个有效载荷没有什么独特之处。如果您希望 route_code
成为唯一值,则必须在您的模型中使用 unique: true
选项相应地定义它。
AssignedDownloadRoute.init(
{
assigned_download_route_id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
},
route_code: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
assigned_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
assigner_user_id: {
type: DataTypes.INTEGER,
allowNull: false,
},
reading_period: {
type: DataTypes.STRING,
allowNull: false,
},
created_modified: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
}
},
{
sequelize: DBInstance,
modelName: 'AssignedDownloadRoute',
tableName: 'assigned_download_route',
timestamps: false,
}
);
有关 Models
选项的更多详细信息以及更复杂的唯一键定义(例如复合键),请阅读此处:https://sequelize.org/master/manual/model-basics.html