在MySql数据库中将primaryKey续订为UUID - 无法正常工作

时间:2018-04-16 19:18:08

标签: mysql node.js express sequelize.js uuid

我正面临Sequalize中实现模型的问题,主键为uuid。我一步一步地遵循所有指示,但我仍然无法解决它。

这就是我的模型的样子:

'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;
};

迁移文件:

'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');
  }
};

在调用post方法创建元素之后,我在ID列中得到一个空值,在测试列中得到NULL ...

Datebase是MySql。

还有其他办法吗?

3 个答案:

答案 0 :(得分:3)

1)在Sequelize中设置自定义键

  

我在Sequalize中遇到了实现模型的问题   主键为uuid。

默认情况下,如果您的模型 不包含primaryKey: true的密钥,则sequelize会假定名为INTEGER的PK类型为id

在您的情况下,您似乎希望制作自己的自定义PK。

在模型中使用以下

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

2)验证

  

在调用post方法创建元素之后,我在ID列中得到一个空值,在测试列中得到NULL ...

如果没有关于您的查询的详细信息,以及您如何播种数据库,则很难具体回答。

但是,test列为null并不会让我感到惊讶,因为您没有列出任何验证。因此,如果您播种/创建未设置test值的行,则它将为null

要创建验证,请执行以下操作

模型:

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

迁移:

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

3)保持模型和迁移同步

(请参阅:https://stackoverflow.com/a/49796801/8954866)在sequelize中,模型和迁移不会自动彼此同步,除非最初使用sequelize-cli model:generate生成。我不确定您是否运行了迁移,或者您是否在针对模型的单元测试中运行查询。但你必须确保它们是同步的。一个主要的例子是,在上述情况下,您的迁移说id类型为UUID,但您的模型会认为它的类型为INTEGER

<强>参考

答案 1 :(得分:0)

确保您的package.json已更新uuid模块,就我而言,这就是问题所在。

accessSecret: {
      type: DataTypes.UUID,
      defaultValue: Sequelize.UUIDV4,
      allowNull: false,
      unique: true,
    },

这很好用, 只要确保package.json有

"uuid": "^8.2.0",

答案 2 :(得分:0)

如果你使用的是PostgreSQL的数据库,请看代码:

syntax error at or near "SERIAL" with autoIncrement only

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('users', {
      id: {
        type: Sequelize.UUID,
        defaultValyue: Sequelize.literal('uuid_generate_v1mc()'),
        primaryKey: true,
        autoIncrement: true, // ERROR: syntax error at or near "SERIAL", if not commented it; remove it
      },
      email: Sequelize.STRING(30),
      created_at: Sequelize.DATE,
      updated_at: Sequelize.DATE,
    });
  },

  down: async queryInterface => {
    await queryInterface.dropTable('users');
  },

};