Почему моя ассоциация продолжения не работает?

Я создал две модели User и Gasto (значит, потраченные на португальском языке), эти две таблицы имеют ассоциацию, например, One User to Many Gasto, поэтому я пытаюсь реализовать OnDelete 'CASCADE', когда я удаляю одного пользователя, все Gasto из этот пользователь должен быть удален вместе, но моя ассоциация не работает. Кто-нибудь может мне помочь?

Моя конфигурация базы данных:

import 'dotenv/config'
import { Options } from 'sequelize'

const config: Options = {
  username: process.env.DB_USER ?? 'root',
  password: process.env.DB_PASS ?? '123456',
  database: 'gastos_app_db',
  host: process.env.DB_HOST ?? 'localhost',
  port: Number(process.env.DB_PORT) ?? 3002,
  dialect: 'mysql',
  dialectOptions: {
    timezone: 'Z'
  },
  logging: false
}

module.exports = config

Миграция от пользователя, у Гасто такой же пример.

'use strict'

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up (queryInterface, Sequelize) {
    await queryInterface.createTable('users', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        allowNull: false,
        autoIncrement: true,
        onDelete: 'CASCADE'
      },
      username: {
        type: Sequelize.STRING,
        allowNull: false
      },
      email: {
        type: Sequelize.STRING,
        allowNull: false
      },
      role: {
        type: Sequelize.STRING,
        allowNull: false
      },
      password: {
        type: Sequelize.STRING,
        allowNull: false
      }
    })
  },

  async down (queryInterface, Sequelize) {
    await queryInterface.dropTable('users')
  }
}

Мой экземпляр Sequelize и конфигурации.

import { Sequelize } from 'sequelize'
import * as config from '../config/database'

export default new Sequelize(config)

Моя Модель пользователя и Ассоциация.

import { DataTypes } from 'sequelize'
import db from '.'
import { Gasto } from './Gasto'

export const User = db.define('User', {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true
  },
  username: {
    type: DataTypes.STRING,
    allowNull: false
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false
  },
  password: {
    type: DataTypes.STRING,
    allowNull: false
  },
  role: {
    type: DataTypes.STRING,
    allowNull: false
  }
}, {
  timestamps: false,
  tableName: 'users',
  underscored: true
})

User.hasMany(Gasto, {
  foreignKey: 'userId',
  onDelete: 'CASCADE'
})

Gasto.hasOne(User, {
  foreignKey: 'id'
})

Модель Гасто:

import { DataTypes } from 'sequelize'
import db from '.'

export const Gasto = db.define('Gasto', {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true
  },
  userId: {
    type: DataTypes.INTEGER,
    allowNull: false
  },
  type: {
    type: DataTypes.STRING,
    allowNull: false
  },
  value: {
    type: DataTypes.INTEGER,
    allowNull: false
  },
  gastoDate: {
    type: DataTypes.STRING,
    allowNull: false
  }
}, {
  timestamps: false,
  tableName: 'gastos',
  underscored: true
})


Гасто Миграция

'use strict'

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up (queryInterface, Sequelize) {
    await queryInterface.createTable('gastos', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        allowNull: false,
        autoIncrement: true
      },
      user_id: {
        type: Sequelize.INTEGER,
        allowNull: false
      },
      type: {
        type: Sequelize.STRING,
        allowNull: false
      },
      value: {
        type: Sequelize.STRING,
        allowNull: false
      },
      gasto_date: {
        type: Sequelize.STRING,
        allowNull: false
      }
    })
  },

  async down (queryInterface, Sequelize) {
    await queryInterface.dropTable('gastos')
  }
}

Я уже прочитал всю документацию и проверил некоторые старые проекты, но не могу найти правильный способ исправить это.

Пожалуйста, покажите миграцию Gasto

Anatoly 07.02.2023 18:11

Вы можете проверить это сейчас.

Igor Brizack 07.02.2023 19:25
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше поле user_id в миграции для создания таблицы gastos должно иметь внутри определение внешнего ключа, а также желаемую логику обновления/удаления (каскад).

user_id: {
  type: Sequelize.INTEGER,
  allowNull: false,
  references: {
    model: 'users',
    key: 'id',
  },
  onUpdate: 'cascade',
  onDelete: 'cascade'
}

Вы можете найти пример этого в документации по интерфейсу запросов .

Спасибо, мой друг, я знал, что мне чего-то не хватало! Оно работает!

Igor Brizack 09.02.2023 12:23

Другие вопросы по теме