La guia de platanus
  • README
  • Acuerdos
    • Guía de Estilo
      • Ejemplo: Módulo para variables de entorno
  • Stack
    • Getting Started
    • Nuestro MVC extendido
    • Ruby/Rails
      • Power Types
        • General
        • Patrones
          • Commands
          • Utils
          • Services
          • Values
          • Observers
      • Potassium
      • Power API
      • Active Admin
        • General
        • Active Admin Addons
      • Pundit
      • Shrine
        • General
        • Manejo y procesamiento de imágenes
      • Pry
      • Strong Migrations
      • Data Migrate
      • Active Job
      • Gems
      • Engines - Modularización en Rails
    • JavaScript
      • Vue
        • General
        • Testing
      • AlpineJS
    • CSS
    • Mobile
      • Expo
      • React Navigation
      • Redux
        • Crear y conectar una slice en Redux
      • Styling
        • Usando Tailwind en React Native
      • Recursos
    • Resolviendo problemas (debugging)
    • Machine Learning
  • Setup
    • Configuración de tu entorno local
      • Instalación Base
        • OSX
        • Windows
        • Linux
      • Tecnologías
        • Ruby
        • Docker
        • Node
      • Herramientas
        • Linters
        • Editores
          • IDE/Editores de Código
            • Visual Studio Code
            • Sublime Text
        • Git
    • Configuración de proyectos
      • Getting Started
      • Heroku
      • Rails
      • Circle CI
      • Vue
      • Apple App Store
      • Google Play
      • Expo
      • S3
      • Git
      • Cloudflare
      • Sendgrid
      • Dominio + Mailing
      • Google Tag Manager, Analytics, Search Console, etc.
        • Google Tag Manager
          • Configurar Google Tag Manager
        • Google Analytics
        • Indexación en Google
        • Google Ads
      • Crear un bucket de S3
      • SlackBot
      • Google BigQuery
  • Deployment
    • Rails
    • Ruby Gems
    • Browser and Node (Open Source)
    • Mobile
      • Mobile Resources
      • Apple App Storage
      • Google Play
  • Upgrades
    • Upgrade de Vue 2 a Vue 3
    • Migración Hound → reviewdog
    • Upgrade de Postgresql
Con tecnología de GitBook
En esta página
  • ¿Por qué la usamos?
  • ¿Cómo la usamos?
  • Casos típicos
  • Proyectos chicos
  • Recursos útiles
  1. Stack
  2. Ruby/Rails

Strong Migrations

AnteriorPrySiguienteData Migrate

Última actualización hace 2 años

es una gema para evitar acciones inseguras a la hora de aplicar migraciones de schema en las bases de datos.

¿Por qué la usamos?

Muchas veces al crear migraciones en Active Record, se pueden generar errores inesperados o incluso downtime de las aplicaciones dado que pueden generar locks en tablas enteras. Strong migrations ayuda a detectar ese tipo de potenciales errores de manera temprana y ofrece alternativas para realizar los mismos cambios de manera segura.

¿Cómo la usamos?

La gema strong migrations viene incluida por defecto en los proyectos generados con Potassium que cuenten con base de datos. En proyectos que no lo tengan, basta con agregar la gema al Gemfile y correr el generador rails generate strong_migrations:install, como se señala . Alternativamente se puede usar potassium para agregar una base de datos al proyecto con potassium install db [--force], que a su vez incluirá la gema.

Al correr cualquier migración, strong migrations revisará si la migración es segura de acuerdo a los lineamientos propuestos en la gema. En caso de no serlo arroja una excepción, de modo que las migraciones inseguras no se puedan ejecutar correctamente. Dicho error además incluye las instrucciones para realizar la migración de la manera recomendada y segura.

Casos típicos

Existen una serie de migraciones que son potencialmente peligrosas detalladas en la documentación de la gema, junto con sugerencias de mejores prácticas y verificaciones particulares para el caso de postgres.

Algunas operaciones peligrosas que es muy común realizar de manera insegura son las siguientes:

Proyectos chicos

En algunos casos las verificaciones que realiza esta gema pueden ser innecesarias si el proyecto está en una etapa temprana o es muy acotado, debido a que ciertos problemas solo surgen cuando el tráfico de las tablas es grande y el tamaño también. Lo anterior también aplica para proyectos más avanzados pero que deseen modificar tablas de la base de datos que no cuenten con información, o que presentan un uso muy limitado.

Si efectivamente es el caso y se cree que los riesgos de correr dichas migraciones son bajos o nulos, la gema ofrece la opción de realizar la migración de todas maneras. Por ejemplo si se desea renombrar una columna, strong migrations alerta sobre los riesgos, pero se puede marcar la operación como segura de la siguiente forma:

class RenameSomeColumn < ActiveRecord::Migration[6.0]
  def change
    safety_assured { rename_column :users, :some_column, :new_name }
  end
end

Sin embargo, es bueno tener estas prácticas incorporadas en los equipos de desarrollo, para cuando la aplicación efectivamente se enfrente a escalas donde sea importante seguir las recomendaciones.

Recursos útiles

: tiene la documentación y las migraciones que detecta la gema. Para cada operación se especifica la forma insegura de realizarla, junto con la razón y la forma recomendada de hacerla. También se detallan sugerencias y configuraciones propias de la gema.

Strong Migrations
aquí
Eliminar una columna
Agregar una columna con un valor por defecto
Modificar una columna para que sea NOT NULL
Añadir una referencia a un modelo (foreign key)
Repositorio