Node.js Sequelize UUID主键+ Postgres

时间:2018-05-18 15:40:45

标签: node.js postgresql orm sequelize.js graphql

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

设置

我在docker容器中使用Postgres(v10)并进行了sequalize(Node.js v10.1.0) )用于模型和GraphQL(0.13.2)+ GraphQL-Sequalize(8.1.0)用于请求处理。

问题

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

'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& #34;," createdAt"," updatedAt"来自"货币" AS"货币" ORDER BY"货币"。" id" ASC;

这会导致"列' 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'

问题

  • 那么,有没有办法强制sequelize使用UUID作为表主键而不定义id列?
  • 有没有办法创建没有id列的列?
  • 可能导致此错误的原因以及应该如何解决?

提前致谢!

2 个答案:

答案 0 :(得分:2)

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

  1. 数据库已从id手动更改为uuid
  2. 您的模型未反映此更改。
  3. 因此,查询正在搜索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);
      }));
    

答案 1 :(得分:0)

这只是我在网上找到的唯一资源,它可以解释设置数据库提供默认值而无需依赖第三方{{1 }} npm软件包:https://krmannix.com/2017/05/23/postgres-autogenerated-uuids-with-sequelize/

简短版本:

  1. 您需要使用sqlz迁移安装“ uuid-ossp” postgres扩展
  2. 定义表时,请使用以下uuiddefaultValue