Node.js Sequelize UUID主键+ Postgres

Num*_*ter 2 postgresql orm node.js sequelize.js graphql

我尝试通过使用sequelize创建数据库模型,但是我面临模型主键的问题。

设置

我在Docker容器中使用Postgres(v10),并为模型隔离(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');
  }
};
Run Code Online (Sandbox Code Playgroud)

模型:

'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;
};
Run Code Online (Sandbox Code Playgroud)

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

执行(默认):从“货币”中选择“ id”,“ uuid”,“名称”,“ ticker”,“ alt_tickers”,“ createdAt”,“ updatedAt”作为“货币”,按“货币”排序ASC;

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

另外,我尝试通过在迁移时将uuid列重命名为id来解决此问题:

  ...      
  id: {
      allowNull: false,
      primaryKey: true,
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4()
  },
  ... 
Run Code Online (Sandbox Code Playgroud)

在模型上:

'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;
};
Run Code Online (Sandbox Code Playgroud)

但是结果是程序启动时出现以下错误:

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

问题

  • 因此,有没有一种方法可以在不定义id列的情况下强制序列化将UUID用作表的主键?
  • 有没有一种方法可以创建没有id列的列?
  • 是什么导致此错误,应如何解决?

提前致谢!

Tom*_*Tom 8

这几乎是我在网上找到的唯一资源,它解释了如何设置数据库为其提供默认值的 UUID 列,而不依赖第三方uuidnpm 包:https ://krmannix.com/2017/ 05/23/postgres-autogenerated-uuids-with-sequelize/

精简版:

  1. 您需要使用 sqlz 迁移安装“uuid-ossp”postgres 扩展
  2. 定义表时,使用这个defaultValueSequelize.literal( 'uuid_generate_v4()' )


Abh*_*avD 5

您尚未在此处发布的是您的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);
  }));
Run Code Online (Sandbox Code Playgroud)