web-dev-qa-db-fra.com

Sequelize primaryKey comme UUID dans la base de données MySql - ne fonctionne pas

Je suis confronté au problème avec le modèle d'implémentation dans Sequalize avec la clé primaire comme uuid. Je suis étape par étape toutes les instructions, mais je ne peux toujours pas les résoudre.

Voici à quoi ressemble mon modèle:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var Todo = sequelize.define('Todo', {
    title: DataTypes.STRING,
    description: DataTypes.STRING,
    test: DataTypes.UUID
  }, {});
  Todo.associate = function(models) {
    // associations can be defined here
  };
  return Todo;
};

Et fichier de migration:

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Todos', {
      id: {
        primaryKey: true,
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV1
      },
      title: {
        type: Sequelize.STRING
      },
      description: {
        type: Sequelize.STRING
      },
      test: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Todos');
  }
};

Après avoir appelé la méthode post pour créer un élément, j'ai obtenu une valeur vide dans la colonne ID et NULL dans la colonne de test ...

La base de données est MySql.

Y a-t-il une autre façon de procéder?

6
agims7

1) Définition de clés personnalisées dans Sequelize

Je suis confronté au problème avec le modèle d'implémentation dans Sequalize avec la clé primaire comme uuid.

Par défaut, si votre modèle ne le fait pas contient une clé avec primaryKey: true, puis sequelize suppose un PK de type INTEGER nommé id.

Dans votre cas, il semble que vous souhaitiez créer votre propre PK personnalisé.

Utilisez ce qui suit dans votre modèle:

var Todo = sequelize.define('Todo', {
    id: {
      primaryKey: true,
      type: DataTypes.UUID
    }
    // rest of properties
 });

2) Validations

Après avoir appelé la méthode post pour créer un élément, j'ai obtenu une valeur vide dans la colonne ID et NULL dans la colonne de test ...

Sans beaucoup d'informations concernant non seulement votre requête, mais la façon dont vous avez semé la base de données, il est difficile de répondre spécifiquement.

Cependant, cela ne m'étonne pas que la colonne test soit null, car vous n'avez répertorié aucune validation. Ainsi, si vous amorcez/créez des lignes qui ne définissent pas de valeur test, ce sera null.

Pour créer des validations, procédez comme suit

modèle:

var Todo = sequelize.define('Todo', {
    // rest of properties
    test: {
      allowNull: false
      type: DataTypes.UUID,
      validate: {
        notNull: true
      }
    }
});

migration:

queryInterface.createTable('Todos', {
    // rest of properties
    test: {
      allowNull: false,
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4
    }
});

3) Garder les modèles et les migrations synchronisés

(voir: https://stackoverflow.com/a/49796801/8954866 ) Dans sequelize, les modèles et les migrations ne sont pas automatiquement synchronisés entre eux, sauf lorsqu'ils sont initialement générés à l'aide de sequelize-cli model:generate. Je ne sais pas si vous avez exécuté vos migrations ou si vous exécutiez votre requête dans un test unitaire par rapport au modèle. Mais vous devez vous assurer qu'ils sont synchronisés. Un exemple principal est que dans le cas ci-dessus, votre migration indique que id est de type UUID, mais votre modèle pensera qu'il est de type INTEGER.

Références

10
vapurrmaid