¿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 modeloFoo
que hace referencia al modeloBar
, 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 columnaname
de la tablaFoo
, puedes hacer lo siguiente:javascript queryInterface.addConstraint('Foo', { type: 'unique', fields: ['name'] })
Funcionalidad de "tiene" y "pertenece"
Las funciones
tiene
ypertenece
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
yBar
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