node.js - 如何使用 Sequelize 创建与特定键的关联?

标签 node.js sequelize.js

我已经设置了所有模型,并且使用表 ID 从一个表到另一个表有一个外键。我还想将 url 属性作为外键,但是每当我包含“type:DataTypes.STRING”时,我都会收到以下错误

Unhandled rejection SequelizeDatabaseError: (conn=195, no: 1215, SQLState: HY000) Cannot add foreign key constraint

当我不包含数据类型时,它会添加 FK,但作为整数。如何创建专门引用 URL 属性的 FK?

谢谢
categories.belongsTo(categoriesTop, {
    foreignKey: {
        name: 'topCategoriesUrl',
        allowNull: false,
        type: DataTypes.STRING,
        referencesKey: "url"
    }
});

Categories_top 架构
const { Sequelize, DataTypes } = require('sequelize');
const db = require('../dbconfig');

const categories_top = db.define('categories_top', {
  url: {
    type: DataTypes.STRING,
    allowNull: false
  },
  title: {
    type: DataTypes.STRING,
    allowNull: false
  },
  subtitle: {
    type: DataTypes.STRING,
    allowNull: false
  },
  image: {
    type: DataTypes.STRING
  }
}, {
  freezeTableName: true,
  timestamps: false
});

module.exports = categories_top;

类别模式
const { Sequelize, DataTypes } = require('sequelize');
const db = require('../dbconfig');
const topCategories = require('./category_top');

const categories = db.define('categories', {
  title: {
    type: DataTypes.STRING,
    allowNull: false
  },
  subtitle: {
    type: DataTypes.STRING,
    allowNull: true
  },
  url: {
    type: DataTypes.STRING,
    allowNull: false
  },
  image: {
    type: DataTypes.STRING
  }
}, {
  freezeTableName: true,
  timestamps: false
});



module.exports = categories;

最佳答案

您必须在 url 中定义 category_top 作为主键或唯一约束,如下所示:

const categories_top = db.define('categories_top', {
  url: {
    type: DataTypes.STRING,
    allowNull: false,
    primaryKey: true, // Either define it as a primary key
    unique: true // OR as a unique constraint
  },
  title: {
    type: DataTypes.STRING,
    allowNull: false
  },
  subtitle: {
    type: DataTypes.STRING,
    allowNull: false
  },
  image: {
    type: DataTypes.STRING
  }
}, {
  freezeTableName: true,
  timestamps: false
});

阅读有关外键 here 的更多信息。

关于node.js - 如何使用 Sequelize 创建与特定键的关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60725876/

相关文章:

node.js - sqlite3 nodejs - 同步返回数据

node.js - 如何向 puppeteer 生成的 PDF 添加水印?

mysql - 使用 sequelize 和 nodejs 更新多条记录?

node.js - Sequelize String 作为 [Object object] 输出

node.js - Node.js 中的应用程序结构?

node.js - Node/Express - 用于 PUT 请求的 bodyParser 为空

javascript - 与 Bluebird 一起 Promising 已经基于 Promise 的库

javascript - 像 web-app 这样的 twitter 中的 Sequelize 中的多对多 self 引用

sql - 使用 Sequelize 选择所有有效的起始字母

node.js - 在不重置数据库的情况下在 sequelize 中添加列