我有两种模式,一种是书,一种是作者,两者之间存在多对多的联系.我最初将它们都实现为具有自动递增的整数ID,但现在我想将它们都切换到UUID.我将UUID数据类型添加到关联中:

// models/book.js
const { Model } = require('sequelize')

module.exports = (sequelize, DataTypes) => {
  class Book extends Model {
    static associate(models) {
      Book.belongsToMany(models.Author, {
        as: 'authors',
        through: 'BookAuthors',
        foreignKey: {
          allowNull: false,
          name: 'bookId',
          type: DataTypes.UUID
        }
      })
    }
  }
  
  Book.init(
    {
      title: {
        type: DataTypes.STRING,
        allowNull: false
      }
    },
    {
      sequelize,
      modelName: 'Book'
    }
  )
  return Book
}
// models/author.js
const { Model } = require('sequelize')

module.exports = (sequelize, DataTypes) => {
  class Author extends Model {
    static associate(models) {
      Author.belongsToMany(models.Book, {
        through: 'BookAuthors',
        foreignKey: {
          allowNull: false,
          name: 'authorId',
          type: DataTypes.UUID
        }
      })
    }
  }
  Author.init(
    {
      name: {
        type: DataTypes.STRING(75),
        allowNull: false,
        unique: true
      },
      biography: DataTypes.TEXT
    },
    {
      sequelize,
      modelName: 'Author'
    }
  )

  return Author
}

在设置数据库的迁移中,我将两个id属性都更改为:

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

我不关心表中的数据,我已经删除了表,并用新代码重新创建了它,但启动服务器失败,并显示以下错误:

Key columns "authorId" and "id" are of incompatible types: integer and uuid.

在执行语句时:

CREATE TABLE IF NOT EXISTS "BookAuthors" ("createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "authorId" INTEGER NOT NULL REFERENCES "Authors" ("id") ON DELETE CASCADE ON UPDATE CASCADE, "bookId" UUID NOT NULL REFERENCES "Books" ("id") ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY ("authorId","bookId"));

AFAIK,则在调用db.sequelize.sync()时由Sequelize自动创建关联表.那么,为什么它接受图书的UUID,而不接受作者的UUID?

推荐答案

您没有在模型中显式地指示PK,因为现在您希望使用默认DB类型(整数)之外的其他类型来定义它们:

图书型号:

Book.init(
    {
      id: {
        allowNull: false,
        defaultValue: Sequelize.UUIDV4,
        primaryKey: true,
        type: Sequelize.UUID
      },
      title: {
        type: DataTypes.STRING,
        allowNull: false
      }
    },
    {
      sequelize,
      modelName: 'Book'
    }
  )

作者模型:

Author.init(
    {
      id: {
        allowNull: false,
        defaultValue: Sequelize.UUIDV4,
        primaryKey: true,
        type: Sequelize.UUID
      },
      name: {
        type: DataTypes.STRING(75),
        allowNull: false,
        unique: true
      },
      biography: DataTypes.TEXT
    },
    {
      sequelize,
      modelName: 'Author'
    }
  )

Node.js相关问答推荐

GitLab SAST中的Nodejcan未找到匹配项

Mongoose查询-如何根据当前查找ID获取其他集合并将其插入到当前查找中?

将图像添加到多个产品的条带 checkout 会话中

在构建完成后,将AddedFiles文件夹的内容复制到dist文件夹

NodeJS `request` 库无法通过 multipart-form-data 将文件发布到 dotnet 服务器

node_modules/preact/src/jsx.d.ts:2145:22 - 错误 TS2304:找不到名称SVGSetElement

Next.js 在我的电脑上没有构建错误,但它们在使用 Vercel 部署时发生

如何使用 NodeJS 加密模块将 ECDH 密钥转换为 PEM 格式

React Native:执行 com.android.build.gradle.internal.tasks.Workers$ActionFacade 时发生故障

如何使用 node 在 koa.js 中发送响应

使用 node/express/Multer,您如何首先判断参数?

Pug - 包括带有include关键字的c代码

Sharp JS 依赖关系 destruct 了 Elastic Beanstalk 上的 Express Server

解决并行保存到 mongodb

使用 WebSockets 有服务器成本吗?

Passport 登录和持久会话

为什么模块级返回语句在 Node.js 中起作用?

为什么数组上的js映射会修改原始数组?

续集findbyid不是一个函数,但显然findAll是

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?