代码之家  ›  专栏  ›  技术社区  ›  Number16BusShelter

node.js sequelize uuid主键+postgres

  •  0
  • Number16BusShelter  · 技术社区  · 8 年前

    我尝试使用Sequelize创建数据库模型,但我面临着模型主键的问题。

    设置

    我在Docker容器中使用postgres(v10)并Sequilize(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;
    };
    

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

    执行(默认):从“货币”中选择“id”、“uuid”、“name”、“ticker”、“alt_tickers”、“createdat”、“updatedat”作为“货币”,按“货币”排序。“id”asc;

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

    或者,我尝试通过重命名来修复它 UUID 列到 身份证件 迁移时:

      ...      
      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”的列已添加到“currencys”的属性中,但未标记为“primarykey:true”

    问题

    • 那么,有没有一种方法可以强制sequelize使用uuid作为表的主键而不定义id列?
    • 有没有创建没有ID列的列的方法?
    • 可能是什么导致了这个错误,应该如何修复它?

    事先谢谢!

    2 回复  |  直到 8 年前
        1
  •  3
  •   AbhinavD    8 年前

    你没有在这里张贴的是你的 model 代码。这就是我想发生的事

    1. 数据库已从手动更改 id uuid .
    2. 您的模型不反映这种变化。

    因此,查询正在搜索 身份证件 UUID .

    你可以修正我的定义 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);
      }));
    
        2
  •  0
  •   Tom    7 年前

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

    简短版本:

    1. 您需要使用sqlz迁移安装“uuid ossp”postgres扩展。
    2. 定义表时,请使用 defaultValue : Sequelize.literal( 'uuid_generate_v4()' )