首页 > 解决方案 > SequelizeDatabaseError:由于并发更新,无法序列化访问

问题描述

Mocha测试beforeEach钩子中,我正在尝试destroy所有表记录。

import { db } from '../src/db/models';

export const truncateTable = () => {
  const promises = Object.keys(db).map(key => {
    if (key !== 'Sequelize' && key !== 'sequelize') {
      console.log(key);
      return db[key].destroy({ where: {} });
    }
  });

  return Promise.all(promises);
};

然后在测试中,我这样做:

describe.only('application mutations', () => {

  beforeEach(() => truncateTable());

  ...

我得到的错误:

SequelizeDatabaseError:由于并发更新,无法序列化访问

标签: mocha.jssequelize.js

解决方案


TL/DR:在您的测试中,如果您想快速删除模型并重置数据库,请使用sync.

describe.only('application mutations', () => {
  beforeEach(async () => {
    await db.sync({force: true})
  });
}

如果你想单独销毁你的模型,你必须在启动一个新模型之前正确地等待你的承诺完成。目前,您的承诺是一次性启动的,因此会出现 Sequelize 错误。

export const truncateTable = async () => {
  const promises = Object.keys(db).map(key => {
    if (key !== 'Sequelize' && key !== 'sequelize') {
      await db[key].destroy({ where: {} });
    }
  });
};

// in your test file
describe.only('application mutations', () => {
  beforeEach(async () => {
    await truncateTable();
  });
})

推荐阅读