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

时间:2018-07-10 14:11:12

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

我开始使用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”,但有任何解释。)

enter image description here

enter image description here

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

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

我收到此错误:

  

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

所以我的问题是:

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

6 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

定义模型时,可以添加配置,在这种情况下,必须添加的选项为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,
  });

答案 2 :(得分:1)

也许答案与您的问题并不完全相关,但我想描述一下我遇到此错误的经验

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

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

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

正如我说的那样,这可能无法满足您的特定订单,但我想分享自己的经验,因为我在查找此错误时没有在互联网上找到此信息。

答案 3 :(得分:0)

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


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

})();



答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

就我而言,问题在于表 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"
    }
);