簡體   English   中英

未處理的拒絕 SequelizeDatabaseError:關系“用戶”不存在

[英]Unhandled rejection SequelizeDatabaseError: relation "users" does not exist

我正在開始使用 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”,任何解釋。)

在此處輸入圖片說明

在此處輸入圖片說明

但是,當我添加以下代碼部分時:

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

我收到此錯誤:

未處理的拒絕 SequelizeDatabaseError:關系“用戶”不存在

所以我的問題是:

  1. 為什么 Sequelize 向用戶添加“s”。 (我知道這是有道理的,但開發人員不應該決定)
  2. 是什么導致了這個錯誤? 我遵循了文檔,但它仍然不起作用?

當您定義模型時,您可以添加配置,在這種情況下,您必須添加的選項是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,
  });

還有另一種有趣的方法可以避免這種情況。 但是您需要真正關注這種實現方式。

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

您故意將user放在這里並在其他編碼位置使用users (假設 sequelize 會自動將所有傳遞的模型名稱(定義的第一個參數)轉換為復數)。 這種編碼方式將簡化您的代碼。

運行該代碼兩次。

在第二次運行之前,注釋掉以下代碼,

// 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 會根據遷移文件名及其字母順序進行遷移。 我的問題是我的文件命名沒有排序以創建正確的連接。 如果您遇到此問題,請確保您的遷移文件以正確的(按字母順序)順序觸發。

正確的順序是首先遷移沒有連接的表(例如 table_A),然后是連接到 table_A 的表。

正如我所說,這可能不是您特定訂單的答案,但我想分享我的經驗,因為我在尋找此錯誤時沒有在互聯網上找到此信息。

就我而言,問題是沒有創建表users 您可以使用CREATE TABLE IF NOT EXISTS (SQL) 手動CREATE TABLE IF NOT EXISTS或在選項對象中添加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"
    }
);

出現此問題是因為創建表是一個異步函數。 問題是,可以在尚未創建表的情況下執行 findAll() 函數。 要解決此問題,您可以使用:


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

})();



只需將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',
        }
    );

如果您希望 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;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM