web-dev-qa-db-ja.com

未処理の拒否SequelizeDatabaseError:リレーション "users"は存在しません

私は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:リレーション "users"は存在しません

だから私の質問は:

  1. Sequelizeがユーザーに「s」を追加するのはなぜですか。 (私はそれが理にかなっていることを知っていますが、開発者がそれを決めるべきではありません)
  2. そのエラーの原因は何ですか?ドキュメントをたどりましたが、それでもうまくいきませんでしたか?
6
Ahmed Ghrib

モデルを定義するときに構成を追加できます。この場合、追加する必要があるオプションは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,
  });
10
ccordon

そのコードを2回実行します。

2回目に実行する前に、次のコードをコメントアウトします。

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

これを回避できる別の興味深い方法があります。ただし、この実装方法に本当に焦点を当てる必要があります。

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

意図的にuserをここに入れ、usersをコーディングの他の場所で使用します(sequelizeは、渡されたすべてのモデル名(defineの最初のパラメーター)を自動的に複数に変換します)。このコーディング方法により、コードが簡略化されます。

0