我有两种模式,一种是书,一种是作者,两者之间存在多对多的联系.我最初将它们都实现为具有自动递增的整数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?