首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sequelize and Node.js : deleting cascade "set null“时的外键约束

Sequelize and Node.js : deleting cascade "set null“时的外键约束
EN

Stack Overflow用户
提问于 2017-09-21 14:44:11
回答 1查看 1.4K关注 0票数 1

我使用的是Sequelize版本4.4.10、Node.js和SQLite。以下是我的模型:

Subscription.js

代码语言:javascript
复制
module.exports = (sequelize, DataTypes) => {
  let Subscription = sequelize.define('Subscription', {
    id: { type: DataTypes.STRING(50), primaryKey: true },
    title: DataTypes.STRING(100),
    url: DataTypes.STRING(50),
    thumbnail_url: DataTypes.STRING(50)
  })

  Subscription.associate = (models) => {
    Subscription.belongsToMany(models.Tag, {
      through: models.TagSubscription,
      onDelete: 'set null',
      onUpdate: 'set null'
    })
  }

  return Subscription
}

Tag.js

代码语言:javascript
复制
module.exports = (sequelize, DataTypes) => {
  let Tag = sequelize.define('Tag', {
    id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
    title: { type: DataTypes.STRING(25) }
  })

  Tag.associate = models => {
    Tag.belongsToMany(models.Subscription, {
      through: models.TagSubscription,
      onDelete: 'set null',
      onUpdate: 'set null'
    })
  }

  return Tag
}

TagSubscription.js

代码语言:javascript
复制
module.exports = (sequelize, DataTypes) => {
  let TagSubscription = sequelize.define('TagSubscription', {

  })

  return TagSubscription
}

这是我的订阅存储库:

SubscriptionRepository.js

代码语言:javascript
复制
let models = require('../models')
let logger = require('bug-killer')

class SubscriptionRepository {

  async deleteAll () {
    try {
      await models.Subscription.destroy({ where: {} })
    } catch (error) {
      logger.error('SubscriptionRepository.deleteAll() error')
      throw (error)
    }
  }

  async findOne (subId) {
    try {
      let subscription = await models.Subscription.findOne({ where: { id: subId } })
      return subscription
    } catch (error) {
      logger.error('SubscriptionRepository.findOne() error')
      throw (error)
    }
  }

  async create (sub) {
    try {
      let subscription = await models.Subscription.create({
        id: sub.id,
        title: sub.title,
        url: sub.url,
        thumbnail_url: sub.thumbnail_url
      })

      return subscription
    } catch (error) {
      logger.error('SubscriptionRepository.create() error')
      throw (error)
    }
  }
}

exports.SubscriptionRepository = SubscriptionRepository

下面是我要测试的函数:

代码语言:javascript
复制
async refreshData () {
    try {
      let extracted = this.getExtractedData(undefined)
      await subscriptionRepository.deleteAll()
      await models.Subscription.bulkCreate(extracted.items, { ignoreDuplicates: true, updateOnDuplicates: ['title', 'url', 'thumbnail_url', 'createdAt', 'updatedAt'] })
    } catch (error) {
      console.log(error)
    }
  }

当我调用refreshData时,它会记录以下错误:

代码语言:javascript
复制
Executing (default): DELETE FROM `Subscriptions`
error SubscriptionRepository.deleteAll() error
{ SequelizeForeignKeyConstraintError: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
    at Query.formatError (/home/xavier/Projets/youtube_manager/node_modules/sequelize/lib/dialects/sqlite/query.js:374:18)
    at Statement.afterExecute (/home/xavier/Projets/youtube_manager/node_modules/sequelize/lib/dialects/sqlite/query.js:119:32)
    at Statement.replacement (/home/xavier/Projets/youtube_manager/node_modules/sqlite3/lib/trace.js:19:31)
  name: 'SequelizeForeignKeyConstraintError',
  parent:
   { Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
     errno: 19,
     code: 'SQLITE_CONSTRAINT',
     sql: 'DELETE FROM `Subscriptions`' },
  original:
   { Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
     errno: 19,
     code: 'SQLITE_CONSTRAINT',
     sql: 'DELETE FROM `Subscriptions`' },
  sql: 'DELETE FROM `Subscriptions`',
  fields: undefined,
  table: undefined,
  value: undefined,
  index: undefined }

为什么会出现这个错误?由于我为delete和update cascade都指定了"set null“行为,销毁()函数应该不会因为违反外键而失败。

EN

回答 1

Stack Overflow用户

发布于 2020-05-29 22:08:05

试一试

代码语言:javascript
复制
onDelete: 'cascade',
onUpdate: 'cascade'

因为如果不存在,它就不能将其设置为null

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46337135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档