【问题标题】:Unhandled rejection SequelizeDatabaseError: relation "users" does not exist未处理的拒绝 SequelizeDatabaseError:关系“用户”不存在
【发布时间】:2018-12-18 10:21:45
【问题描述】:

我开始使用 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'
    });
  });

直到这里,一切正常。并且表“用户”已正确构建和填充。 (虽然我不明白 Sequelize 会自动将“s”附加到“用户”,任何解释。)

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

User.findAll().then(users => {
  console.log(users)
})

我得到这个错误:

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

所以我的问题是:

  1. 为什么 Sequelize 会向用户添加“s”。 (我知道这是有道理的,但开发人员不应该这样决定)
  2. 是什么导致了这个错误?我按照文档进行了操作,但仍然无效?

【问题讨论】:

  • 关于你的第一个问题,根据 sequelizejs 文档: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, 更多信息可以在这里找到:docs.sequelizejs.com/manual/tutorial/models-definition.html

标签: javascript node.js postgresql sequelize.js pgadmin


【解决方案1】:

如果您希望 Sequelize 对模型使用单数词 ('info') 并为表使用相同的单数词 ('info'),您可以将模型命名为 'info' 并将 tablename: 'info' 添加到模型的定义。

这是一种逐个表控制 Sequelize 的默认行为是否复数模型名称的方法。

info.js
module.exports = (sequelize, DataTypes) => {
  const info = sequelize.define('info', {
    firstname: DataTypes.STRING,
    email: DataTypes.STRING,
    phone: DataTypes.STRING,
  }, {
      tableName: 'info'
  });
  return info;
};

【讨论】:

    【解决方案2】:

    就我而言,问题是表users 没有创建。您可以使用CREATE TABLE IF NOT EXISTS (SQL) 手动创建表或在选项对象中添加tableName = "users"

    export const User = db.define('user',
        {
            id: {
                type: DataTypes.UUIDV4,
                autoIncrement: true,
                primaryKey: true,
            },
            name: {
                type: new DataTypes.STRING(128),
                allowNull: false,
            },
            email: {
                type: new DataTypes.STRING(128),
                allowNull: true,
            },
            password: {
                type: new DataTypes.STRING(128),
                allowNull: true,
            },
        },
        {
            freezeTableName: true,
            tableName: "users"
        }
    );
    

    【讨论】:

      【解决方案3】:

      只需将tableName: "Users" 附加到您的模型配置即可。

      我发现解决的最简单方法是在模型上显式设置tableName。正如其他人所提到的,sequelize 默认使用模型的复数形式作为表名。比如User,变成Users。

      查询时,sequelize 会处理与模型名称相同的表User。通过在模型中定义tableName,sequelize 应该搜索正确的表。将tableName: "Users" 附加到您的模型配置中,即:

       User.init(
              {
                  email: DataTypes.STRING,
                  password: DataTypes.STRING,
                  role: DataTypes.INTEGER,
              },
              {
                  sequelize,
                  modelName: 'User',
                  tableName: 'Users',
              }
          );
      

      【讨论】:

        【解决方案4】:

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

        
        (async ()=>{
            await User.sync({force: true});
            // Table created
            await User.create({
              firstName: 'John',
              lastName: 'Hancock'
            });
            const users=await User.findAll();
            console.log(users);
        
        })();
        
        
        
        

        【讨论】:

          【解决方案5】:

          也许答案与您的问题并不完全相关,但我想描述一下我对这个错误的体验

          错误:关系“用户”不存在。

          Sequelize 似乎根据迁移文件名和字母顺序进行迁移。我的问题是我的文件命名没有排序以创建正确的连接。 如果您遇到此问题,请确保您的迁移文件以正确(按字母顺序)顺序触发。

          正确的顺序是先迁移没有连接的表(例如table_A),然后迁移有连接的表到table_A。

          正如我所说,这可能不是您特定订单的答案,但我想分享我的经验,因为我在寻找此错误时没有在互联网上找到此信息。

          【讨论】:

            【解决方案6】:

            还有另一种有趣的方法可以避免这种情况。但是您需要真正专注于这种实现方式。

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

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

            【讨论】:

              【解决方案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,
                });
              

              【讨论】:

                【解决方案8】:

                运行该代码两次。

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

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

                【讨论】:

                • 我知道教程没有这么说。我现在正在阅读教程,并在查看您的问题后弄清楚了。
                猜你喜欢
                • 2019-06-02
                • 2016-07-21
                • 2018-10-15
                • 2020-07-08
                • 1970-01-01
                • 2019-09-19
                • 2017-09-20
                • 1970-01-01
                • 2020-06-13
                相关资源
                最近更新 更多