web-dev-qa-db-fra.com

Rejet non géré SequelizeDatabaseError: la relation "utilisateurs" n'existe pas

Je commence avec Sequelize. Je suis la documentation qu'ils fournissent sur leur site Web: 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'
    });
  });

Jusqu'ici, tout fonctionne parfaitement. Et la table "utilisateur" est correctement construite et remplie. (Bien que je ne comprenne pas que Sequelize ajoute automatiquement un "s" à "utilisateur", toute explication.)

enter image description here

enter image description here

Cependant, lorsque j'ajoute la partie de code suivante:

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

Je reçois cette erreur:

Rejet non géré SequelizeDatabaseError: la relation "utilisateurs" n'existe pas

Mes questions sont donc:

  1. Pourquoi Sequelize ajoute un "s" à l'utilisateur. (Je sais que cela a du sens, mais le développeur ne devrait-il pas en décider)
  2. Quelle est la cause de cette erreur? J'ai suivi la documentation mais ça n'a toujours pas fonctionné?
6
Ahmed Ghrib

Lorsque vous définissez votre modèle, vous pouvez ajouter des configurations, dans ce cas, l'option que vous devez ajouter est freezeTableName empêche les noms d'être pluriels.

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

Exécutez ce code deux fois.

Avant d'exécuter la deuxième fois, mettez en commentaire le code suivant,

// 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

Il existe une autre façon intéressante d'éviter cela. Mais vous devez vraiment vous concentrer sur ce mode de mise en œuvre.

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

vous mettez intentionnellement user ici et utilisez users à d'autres endroits du codage (Supposons que sequelize transformera automatiquement tous les noms de modèle passés (premier paramètre de define) au pluriel). Cette façon de coder simplifiera votre code.

0
Sahan Dissanayaka