¿Secuela crea limitaciones en la base de datos?

En primer lugar, im solía trabajar con Django como marco de ORM, y django maneja todo para mí... creando restricciones, tablas y etc... pero cuando vi que secuela es un marco de ORM decidí dar un cambio en una mina de proyecto usando Express.

Hasta ahora im usando migraciones, pero puedo decir que es muy diferente de la manera django, puedo generar un modelo y las primeras migraciones de él con el cli, pero quiero crear toda la tabla con restricciones y etc, ¿hay una manera de hacer eso? o las funciones "tiene" y "pertenece" sólo validar datos desde una perspectiva de backend en lugar de crear realmente las limitaciones en el backend?

¿Otra cosa es que realmente tengo que hacer todo mi trabajo dos veces usando migraciones? ¿Configurar mis modelos y configurar todos los campos en las migraciones?

¿Por último, hay una manera de limpiar la base de datos y re-correr las migraciones? sin migraciones puedo utilizar sincron ({force:true}) pero que no funcionan con migraciones.

'use strict'
const {
  Model
} = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  class Foo extends Model {
    static associate (models) {
      models.Foo.belongsTo(models.Bar, { foreignKey: 'foo_id' });
    }
  };
  Foo.init({
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
    name: {
        type: DataTypes.STRING(100),
        allowNull: false,
        unique: true,
    },
  }, {
    sequelize,
    modelName: 'foo'
  })
  return Foo
}

const {
  Model
} = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  class Bar extends Model {
    static associate (models) { }
  };
  Bar.init({
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
    name: {
        type: DataTypes.STRING(100),
        allowNull: false,
        unique: true,
    },
  }, {
    sequelize,
    modelName: 'bar'
  })
  return Bar
}

Y las migraciones son como

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('foo', {
      id: {
        type: Sequelize.DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: Sequelize.DataTypes.STRING,
        allowNull: false,
        unique: true,
      },
    })
  },
  // How can i create my constraints here?
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('foo')
  }
};

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('bar', {
      id: {
        type: Sequelize.DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: Sequelize.DataTypes.STRING,
        allowNull: false,
        unique: true,
      },
      foo_id: {
        type: Sequelize.DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
    })
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('bar')
  }
};

Pregunta hecha hace 3 años, 4 meses, 28 días - Por Elina


2 Respuestas:

  • Para agregar restricciones a tu base de datos usando Sequelize, puedes hacerlo directamente en las migraciones. Aquí te muestro cómo puedes agregar algunas restricciones en tus migraciones:

    En la migración de la tabla 'foo', puedes agregar una restricción de clave externa (foreign key) para conectar la tabla 'bar':

    javascript
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable('foo', {
          id: {
            type: Sequelize.DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
          },
          name: {
            type: Sequelize.DataTypes.STRING,
            allowNull: false,
            unique: true,
          },
          bar_id: {
            type: Sequelize.DataTypes.INTEGER,
            allowNull: false, // Asegura que el campo no pueda ser nulo
            references: {
              model: 'bar', // Tabla a la que hace referencia
              key: 'id' // Campo de la tabla 'bar' al que se hace referencia
            }
          },
        })
      },
      down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable('foo')
      }
    };
    

    En este ejemplo, se establece una restricción de clave externa en el campo 'bar_id' de la tabla 'foo' para que haga referencia al campo 'id' de la tabla 'bar'.

    En cuanto a la limpieza de la base de datos y la ejecución nuevamente de las migraciones, Sequelize no proporciona un método sync({force: true}) como en Django. En cambio, puedes revertir y volver a aplicar las migraciones para limpiar la base de datos y volver a ejecutar las migraciones. Puedes hacerlo manualmente o escribir un script que haga este proceso de forma automatizada.

    Espero que esta información te sea útil para trabajar con las restricciones en tu base de datos utilizando Sequelize. Si tienes más preguntas o dudas, no dudes en consultarme.

    Respondida el Dec 19, 2020 a las 23:06 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Creación de limitaciones con Sequelize

    Sí, puedes crear limitaciones en la base de datos utilizando Sequelize. Puedes hacerlo definiendo las opciones de restricción al crear el modelo o al crear las migraciones.

    Definir limitaciones en el modelo

    Puedes definir limitaciones en el modelo utilizando el método init(). Por ejemplo, para crear una restricción de clave externa en el modelo Foo que hace referencia al modelo Bar, puedes hacer lo siguiente:

    javascript
    class Foo extends Model {
      static associate (models) {
        models.Foo.belongsTo(models.Bar, { foreignKey: 'foo_id', constraints: true });
      }
    };
    

    Definir limitaciones en las migraciones

    También puedes definir limitaciones en las migraciones utilizando el método addConstraint(). Por ejemplo, para crear una restricción única en la columna name de la tabla Foo, puedes hacer lo siguiente:

    javascript
    queryInterface.addConstraint('Foo', {
      type: 'unique',
      fields: ['name']
    })
    

    Funcionalidad de "tiene" y "pertenece"

    Las funciones tiene y pertenece en Sequelize no crean limitaciones en la base de datos. Solo validan los datos desde la perspectiva del back-end.

    Duplicación del trabajo con las migraciones

    No es necesario configurar tus modelos y campos dos veces usando migraciones. Puedes definir el modelo en el archivo de migración y luego ejecutar las migraciones para crear la tabla y las limitaciones.

    Limpiar la base de datos y volver a ejecutar las migraciones

    Para limpiar la base de datos y volver a ejecutar las migraciones, puedes utilizar el método sync() con la opción { force: true }. Sin embargo, esto eliminará todas las tablas y datos de la base de datos, por lo que debes tener cuidado al utilizarlo.

    javascript
    sequelize.sync({ force: true })
    

    Ejemplo de migraciones con restricciones

    Aquí tienes un ejemplo de migraciones que crean las tablas Foo y Bar con las restricciones necesarias:

    javascript
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable('foo', {
          id: {
            type: Sequelize.DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
          },
          name: {
            type: Sequelize.DataTypes.STRING,
            allowNull: false,
            unique: true,
          },
        })
    
        await queryInterface.createTable('bar', {
          id: {
            type: Sequelize.DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
          },
          name: {
            type: Sequelize.DataTypes.STRING,
            allowNull: false,
            unique: true,
          },
          foo_id: {
            type: Sequelize.DataTypes.INTEGER,
            references: {
              model: 'foo',
              key: 'id'
            },
            onUpdate: 'CASCADE',
            onDelete: 'CASCADE'
          },
        })
      },
    
      down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable('bar')
        await queryInterface.dropTable('foo')
      }
    };
    

    Respondida el Dec 19, 2020 a las 23:21 - por Gemini

    Votos positivos: 0 | Votos negativos: 0