Перенос Sequelize с преобразованием поля первичного ключа Sequelize.UUID в целочисленный автоинкремент в MYSQL - PullRequest
0 голосов
/ 20 октября 2018

Я использую sequelize CLI для генерации и запуска миграций БД.Проблема, с которой я сталкиваюсь, заключается в том, что в поле id установлен тип данных Sequelize.UUID, который отображается как целое с автоинкрементом в mysql.Вот моя модель пользователя и миграция:

Модель пользователя

    'use strict';
    module.exports = (sequelize, DataTypes) => {
      const User = sequelize.define('User', {
        UserName: {type:DataTypes.STRING,unique:true,allowNull:false},
        FirstName:{type: DataTypes.STRING,allowNull:true},
        LastName: {type:DataTypes.STRING,allowNull:true},
        Email: {type:DataTypes.STRING,allowNull:false,unique:true,validate: { isEmail: {msg: "Invalid Email"} }},
        Password: {type:DataTypes.STRING,allowNull:false},
        Avatar: {type:DataTypes.STRING,allowNull:true},

      }, {});
      User.associate = function(models) {

        User.hasMany(models.RoleUser,
            {
                foreignKey:'UserId',
                as:'userroles',
                sourceKey:'id'
            }),

        User.belongsTo(models.Country,
            {
                foreignKey:'CountryId',
                targetKey:'id'
            }),

            User.belongsToMany(models.Role,
                {
            through: 'RoleUser',
            foreignkey:'UserId'

        })


     };
      return User;
    };

**User Migration file:**

'use strict';
const uuidv4 = require('uuid/v4');

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        primaryKey: true,
        type: Sequelize.UUID
        defaultValue:uuidv4()
      },
      UserName: {
        type: Sequelize.STRING
      },
      FirstName: {
        type: Sequelize.STRING
      },
      LastName: {
        type: Sequelize.STRING
      },
      Email: {
        type: Sequelize.STRING
      },
      Password: {
        type: Sequelize.STRING
      },
      Avatar: {
        type: Sequelize.STRING
      },

      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

ПОСЛЕ МИГРАЦИИ, ЕГО ОБЛАСТЬ ПРЕОБРАЗОВАНА В INT AUTOINCREMENT IN MYSQL:

id: {
            allowNull: false,
            primaryKey: true,
            type: Sequelize.UUID
            defaultValue:uuidv4()
          },

Любой указатель на то, почему это происходит?Пожалуйста помогите.Кажется, что даже ассоциации не создаются вообще, поскольку внешние ключи имеют тип Sequelize.UUID

1 Ответ

0 голосов
/ 21 октября 2018

Я исправил проблему, добавив поле идентификатора в модель со свойством первичного ключа, установленным в значение true.

 id: {
type:DataTypes.UUID,
allowNull:false,
unique:true,
primaryKey:true
},

Его аналог sequelize автоматически сгенерирует поле идентификатора типа INTEGER AUTOINCREAMENT, если модель не имеетполе с первичным ключом, установленным в true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...