未处理的拒绝SequelizeDatabaseError:关系“用户”不存在

Ahm*_*rib 2 javascript postgresql node.js pgadmin sequelize.js

我正在开始使用Sequelize。我正在关注他们在其网站上提供的文档:http : //docs.sequelizejs.com/manual/installation/getting-started.html

const Sequelize = require('sequelize');
const sequelize = new Sequelize('haha', 'postgres', 'postgres', {
  host: 'localhost',
  dialect: 'postgres',
  operatorsAliases: false,

  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  },

  // SQLite only
  storage: 'path/to/database.sqlite'
});


sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });


  const User = sequelize.define('user', {
    firstName: {
      type: Sequelize.STRING
    },
    lastName: {
      type: Sequelize.STRING
    }
  });

  // force: true will drop the table if it already exists
  User.sync({force: true}).then(() => {
    // Table created
    return User.create({
      firstName: 'John',
      lastName: 'Hancock'
    });
  });
Run Code Online (Sandbox Code Playgroud)

到这里为止,一切正常。并正确构建并填充了“用户”表。(尽管我不理解Sequelize会在“用户”后自动添加“ s”,但有任何解释。)

在此处输入图片说明

在此处输入图片说明

但是,当我添加以下代码部分时:

User.findAll().then(users => {
  console.log(users)
})
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

未处理的拒绝SequelizeDatabaseError:关系“用户”不存在

所以我的问题是:

  1. 为什么Sequelize向用户添加“ s”。(我知道这是有道理的,但开发人员不应该决定这样做)
  2. 是什么导致该错误?我遵循了文档,但是仍然无法使用?

小智 7

在定义模型时,可以添加配置,在这种情况下,必须添加的选项是freezeTableName防止名称复数。

const User = sequelize.define('user', {
  firstName: {
    type: Sequelize.STRING
  },
  lastName: {
    type: Sequelize.STRING
  }
}, {
    // disable the modification of table names; By default, sequelize will automatically
    // transform all passed model names (first parameter of define) into plural.
    // if you don't want that, set the following
    freezeTableName: true,
  });
Run Code Online (Sandbox Code Playgroud)


小智 6

还有另一种有趣的方法可以避免这种情况。但你需要真正关注这种实施方式。

const User = sequelize.define("user", {
    firstname: {
      type: Sequelize.STRING
    },
    lastname: {
      type: Sequelize.STRING
    }
  });
Run Code Online (Sandbox Code Playgroud)

你故意放在user这里并users在其他编码地方使用(假设sequelize会自动将所有传递的模型名称(define的第一个参数)转换为复数)。这种编码方式将简化您的代码。


小智 5

出现此问题的原因是创建表是一个异步函数。问题是,findAll() 函数可以在表尚未创建时执行。要解决这个问题,您可以使用:


(async ()=>{
    await User.sync({force: true});
    // Table created
    const users=await User.findAll();
    console.log(users);

})();



Run Code Online (Sandbox Code Playgroud)


小智 1

运行该代码两次。

第二次运行之前,注释掉以下代码,

// force: true will drop the table if it already exists
User.sync({force: true}).then(() => {
  // Table created
  return User.create({
    firstName: 'John',
    lastName: 'Hancock'
  });
});
Run Code Online (Sandbox Code Playgroud)