首页 > 解决方案 > Node.js Sequelize UUID 主键 + Postgres

问题描述

我尝试使用 sequelize 创建数据库模型,但我遇到了模型主键的问题。

环境

我在 docker 容器中使用 Postgres (v10),对模型使用 sequalize (Node.js v10.1.0),对请求处理使用 GraphQL (0.13.2) + GraphQL-Sequalize (8.1.0)。

问题

通过 sequelize-cli 创建模型后,我手动尝试将 id 列替换为 uuid。这是我正在使用的模型迁移。

'use strict';
const DataTypes = require('sequelize').DataTypes;

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Currencies', {
      uuid: {
        primaryKey: true,
        type: Sequelize.UUID,
        defaultValue: DataTypes.UUIDV4,
        allowNull: false
      },
      name: {
        type: Sequelize.STRING
      },
      ticker: {
        type: Sequelize.STRING
      },
      alt_tickers: {
        type: Sequelize.ARRAY(Sequelize.STRING)
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Currencies');
  }
};

模型:

'use strict';
module.exports = (sequelize, DataTypes) => {
    const Currency = sequelize.define('Currency', {
        uuid: DataTypes.UUID,
        name: DataTypes.STRING,
        ticker: DataTypes.STRING,
        alt_tickers: DataTypes.ARRAY(DataTypes.STRING)
    }, {});
    Currency.associate = function(models) {
        // associations can be defined here
    };
    return Currency;
};

由于一些问题,sequalize 执行下一个表达式:

执行(默认):SELECT "id", "uuid", "name", "ticker", "alt_tickers", "createdAt", "updatedAt" FROM "Currencies" AS "Currency" ORDER BY "Currency"."id"升序;

这会导致“列 'id' 不存在”错误。

或者,我尝试通过在迁移时将uuid列重命名为id来修复它:

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

在模型中:

'use strict';
module.exports = (sequelize, DataTypes) => {
    const Currency = sequelize.define('Currency', {
        id: DataTypes.INTEGER,
        name: DataTypes.STRING,
        ticker: DataTypes.STRING,
        alt_tickers: DataTypes.ARRAY(DataTypes.STRING)
    }, {});
    Currency.associate = function(models) {
        // associations can be defined here
    };
    return Currency;
};

但结果是程序开始时出现以下错误:

错误:名为“id”的列已添加到“货币”的属性中,但未标记为“primaryKey:true”

问题

提前致谢!

标签: node.jspostgresqlormsequelize.jsgraphql

解决方案


您没有在此处发布的是您的model代码。这就是我认为已经发生的事情

  1. 数据库已手动从 更改iduuid
  2. 您的模型未反映此更改。

因此,查询同时搜索iduuid

您可以像下面那样在您的模型中修复我的定义uuid并将其设为主键

const User = sequelize.define('user', {
  uuid: {
    type: Sequelize.UUID,
    defaultValue: Sequelize.UUIDV1,
    primaryKey: true
  },
  username: Sequelize.STRING,
});

sequelize.sync({ force: true })
  .then(() => User.create({
    username: 'test123'
  }).then((user) => {
    console.log(user);
  }));

推荐阅读