<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rony Quispe</title>
    <description>The latest articles on DEV Community by Rony Quispe (@rquispeq).</description>
    <link>https://dev.to/rquispeq</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F811108%2Fce4962fd-ff0a-4653-b1fc-d006716d3bd8.jpg</url>
      <title>DEV Community: Rony Quispe</title>
      <link>https://dev.to/rquispeq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rquispeq"/>
    <language>en</language>
    <item>
      <title>Crea tu primera app de escritorio con Python y PyQt5 (paso a paso)</title>
      <dc:creator>Rony Quispe</dc:creator>
      <pubDate>Sat, 21 Jun 2025 18:01:00 +0000</pubDate>
      <link>https://dev.to/rquispeq/crea-tu-primera-app-de-escritorio-con-python-y-pyqt5-paso-a-paso-46l4</link>
      <guid>https://dev.to/rquispeq/crea-tu-primera-app-de-escritorio-con-python-y-pyqt5-paso-a-paso-46l4</guid>
      <description>&lt;p&gt;¿Alguna vez quisiste crear tu propia app para automatizar algo, pero pensaste que era muy difícil? A mí me pasó.&lt;br&gt;
Todo comenzó cuando una amiga que no le gusta ser oprimida por el sistema me dijo que quería poder descargar videos sin tener que inundarse de publicidad y virus.&lt;br&gt;
Así que se me ocurrió crear una aplicación pequeña para ella. Una vez terminado vi que esto podría mejorar así que decidí crear algo un poco más completo.&lt;/p&gt;

&lt;p&gt;Al ver todo lo que tenía que hacer, decidí investigar y me encontré con esta herramienta muy común en el campo de Python: PyQt5.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué PyQt5? 🤔
&lt;/h2&gt;

&lt;p&gt;Es de las opciones más completas y potentes si te encuentras en la necesidad de crear una interfaz gráfica con Python. Es multiplataforma, se desenvuelve bien al trabajar con hilos (threads) y a diferencia de una herramienta similar como Tkinter, tiene soporte para todo lo que necesitarás. Tablas, botones, comboboxes, diálogos, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalación de PyQt5
&lt;/h3&gt;

&lt;p&gt;Como toda librería de python, podremos instalarla usando el comando:&lt;br&gt;
&lt;code&gt;pip install PyQt5&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Capítulo 1: El esqueleto
&lt;/h2&gt;

&lt;p&gt;Aunque he mencionado una app al inicio que es medianamente completa, en este artículo solo nos limitaremos a crear una app base para que puedas comenzar a crear tu propia aplicación.&lt;/p&gt;

&lt;h3&gt;
  
  
  El esqueleto
&lt;/h3&gt;

&lt;p&gt;Nuestra app tendrá lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una ventana principal&lt;/li&gt;
&lt;li&gt;Un campo para ingresar texto&lt;/li&gt;
&lt;li&gt;Un botón que accionará un evento&lt;/li&gt;
&lt;li&gt;Separar los archivos para mayor escalabilidad&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Estructura del proyecto
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mi_app/
├── core/
│   └── logic.py
├── gui/
│   └── main_window.py
├── main.py

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como se puede ver, tendremos en esencia 3 archivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;El main&lt;/strong&gt;: Será responsable de inicializar y lanzar la interfaz gráfica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;main_window&lt;/strong&gt;: El responsable de construir todos los elementos gráficos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;logic&lt;/strong&gt;: Que se encargará de manejar la lógica del negocio.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Capítulo 2:  Los Elementos Gráficos en PyQt5 🔥💧🍃🪨
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main.py
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import  sys
from PyQt5.QtWidgets import QApplication
from gui.main_window import MainWindow
def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vemos que Main solo tiene un método definido el cual se ejecuta e instancia QApplication, que es el Widget de PyQt5 que se encarga de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manejar eventos del sistema operativo.&lt;/li&gt;
&lt;li&gt;Gestionar recursos visuales.&lt;/li&gt;
&lt;li&gt;Correr el ciclo de eventos que mantiene viva la ventana.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luego creamos una instancia de nuestra Clase MainWindow el cual se mostrará gracias al método show()&lt;/p&gt;

&lt;p&gt;Y por último pasamos todo esto al sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  MainWindow.py
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89mxqr5n9pftav5rjew8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89mxqr5n9pftav5rjew8.png" alt="Clase Main Window" width="800" height="716"&gt;&lt;/a&gt;&lt;br&gt;
Ahora tenemos nuestra clase MainWindow. Usando varios elementos widgets de  nuestra librería.&lt;/p&gt;

&lt;p&gt;Primero nombra la aplicación como &lt;strong&gt;Mi primera App PyQt5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxloylsedyudolmimijd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxloylsedyudolmimijd.png" alt="Set title" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segundo, crea la variable input, label y button. Usando las clases QLineEdit, QLabel y QPushButton. Que en esencia son los widgets básicos para crear elementos en nuestra interfaz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1vbf4x79cgc6fu8g6uj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1vbf4x79cgc6fu8g6uj.png" alt="Widgets" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego, conectamos el botón con el método say_hello&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8px6ardghaimvyluk8xa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8px6ardghaimvyluk8xa.png" alt="connect button" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Layout
&lt;/h4&gt;

&lt;p&gt;Como vemos, luego de crear las variables anteriores. Se crea una variable llamada layout, que es la forma en la que la librería acomoda los elementos en la interfaz. Básicamente es un cuadro "invisible" en la cual se van insertando los widgets que vamos creando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8c5qqwv4b5afdltuivf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8c5qqwv4b5afdltuivf.png" alt="Layout" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por ultimo se crea un contenedor principal al cual establecemos el layout.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffc4nt0kbpyinf5hsy9ct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffc4nt0kbpyinf5hsy9ct.png" alt="Container" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sé que parece incongruente que un layout se agregue a un widget y un widget se agregue a layouts. Pero entenderás esto de manera más clara mientras vas creando tu aplicación&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Y al final tendremos el método que será accionado al hacer click en el botón. El cual conseguirá el texto que se ingresó en el input y lo validará para mostrar en el label&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fvyifhmvpzk3mz8tpe5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fvyifhmvpzk3mz8tpe5.png" alt="say hello method" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Logic
&lt;/h3&gt;

&lt;p&gt;Por último tenemos la clase Logic que se encargará de manejar las reglas del negocio. Esto es importante porque recordemos que es necesario separar  la lógica de la interfaz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffghb2u49pifbe66oxvho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffghb2u49pifbe66oxvho.png" alt="Class Logic" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por simplicidad, haremos que la clase solo tenga un método el cual validará si el texto ingresado es o no un número. Y de serlo, deberá mostrar que el texto no es válido (tal como se ve en el método say_hello de la clase MainWindow)&lt;/p&gt;




&lt;h3&gt;
  
  
  Capítulo 3: El conjuro 🪄
&lt;/h3&gt;

&lt;p&gt;Ahora al ejecutar esto nos aparecerá lo siguiente. Una simple ventana increíblemente chiquita. Con el input, el botón de acción y un label cuyo texto cambiará si ingresamos un texto en el input&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jxy2dgxpjx014y9whf1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jxy2dgxpjx014y9whf1.png" alt="Program" width="336" height="119"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Texto ingresado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt7xh51jm00i2mtpiuwa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt7xh51jm00i2mtpiuwa.png" alt="Program 2" width="333" height="118"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Capítulo 4: Viaje terminado
&lt;/h3&gt;

&lt;p&gt;Y así es como se puede comenzar a crear aplicaciones de escritorio en Python. Con una estructura de archivos base que nos ayudará a separar los diferentes aspectos de nuestro programa.&lt;br&gt;
Esto parece ser tonto al inicio pero es fundamental porque muchas veces podremos desconocer que tanto puede crecer un proyecto mientras se va desarrollando. Esto nos permite poder reducir muchos tiempos de desarrollo ya que está modulado desde el inicio. &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Si haz llegado hasta aquí, ¡Muchas gracias por leer este artículo!, te animo a dejar un comentario de cualquier tipo. Y cualquier duda ten por seguro que te la responderé a la brevedad. 😁&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>pyqt5</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>💪Reinicia una migración específica en Laravel 'migrate:refresh'</title>
      <dc:creator>Rony Quispe</dc:creator>
      <pubDate>Sat, 17 Jun 2023 19:17:06 +0000</pubDate>
      <link>https://dev.to/rquispeq/reinicia-una-migracion-especifica-en-laravel-migraterefresh-4m09</link>
      <guid>https://dev.to/rquispeq/reinicia-una-migracion-especifica-en-laravel-migraterefresh-4m09</guid>
      <description>&lt;p&gt;Cuando trabajamos con Laravel y su potente sistema de migraciones de base de datos, a veces nos encontramos en situaciones en las que necesitamos reiniciar una migración específica sin tener que recurrir a complicados pasos de rollback. Afortunadamente, Laravel nos ofrece una solución elegante con el comando migrate:refresh. En este artículo, exploraremos cómo usar migrate:refresh para reiniciar una migración de un lote en particular, sin afectar las migraciones anteriores o posteriores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de comenzar debes conocer:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Laravel básico&lt;/li&gt;
&lt;li&gt;Migraciones laravel básico&lt;/li&gt;
&lt;li&gt;Comandos artisan&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comenzamos ✍️
&lt;/h2&gt;

&lt;p&gt;Supongamos que estamos desarrollando una aplicación web para una escuela. Hemos realizado varias migraciones para configurar nuestras tablas, incluyendo las relacionadas con los cursos, las notas y los estudiantes.&lt;/p&gt;

&lt;p&gt;Para enfocarnos en el tema, ignoraremos que hay dentro de las clases y que cambios tendrán, concentremonos en las migraciones 🐺&lt;/p&gt;

&lt;h3&gt;
  
  
  Migraciones 👷‍♂️
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Migración de courses (Batch 1):&lt;/strong&gt;&lt;br&gt;
Creamos una migración inicial para la tabla de courses llamada &lt;code&gt;2023_06_17_012246_create_courses_table.php&lt;/code&gt; y la ejecutamos mediante &lt;code&gt;php artisan migrate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migración de grades (Batch 2):&lt;/strong&gt;&lt;br&gt;
Posteriormente, agregamos otra migración para la tabla de grades llamada &lt;code&gt;2023_06_17_012637_create_grades_table.php.php&lt;/code&gt; y la ejecutamos con &lt;code&gt;php artisan migrate&lt;/code&gt;. Esta migración se asigna al segundo lote (batch 2) en la tabla migrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migración de students (Batch 3):&lt;/strong&gt;&lt;br&gt;
Continuamos con otra migración para la tabla de students llamada &lt;code&gt;2023_06_17_013600_create_students_table.php.php&lt;/code&gt; y la ejecutamos con &lt;code&gt;php artisan migrate&lt;/code&gt;. Esta migración se asigna al tercer lote (batch 3) en la tabla migrations.&lt;/p&gt;

&lt;p&gt;En la tabla migrations de nuestra base de datos se veria lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gXFSBGyB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yfabihmjcp899jbb7ivj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gXFSBGyB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yfabihmjcp899jbb7ivj.png" alt="Image description" width="632" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Situación
&lt;/h3&gt;

&lt;p&gt;Ahora, supongamos que hemos realizado cambios en la migración de grades (&lt;code&gt;2023_06_17_012637_create_grades_table.php.php&lt;/code&gt;) y deseamos reiniciar solo esa migración sin afectar las migraciones de cursos y estudiantes.&lt;/p&gt;

&lt;p&gt;Ejecutamos el comando&lt;br&gt;
&lt;code&gt;php artisan migrate:refresh --path=database/migrations/2023_06_17_012637_create_grades_table.php.php&lt;/code&gt;&lt;br&gt;
El comando migrate:refresh lo que hace es el ejecutar por cada migración su método down y luego su método up.&lt;br&gt;
Este comando por si solo reiniciaria todos los archivos de migraciones. Por ello usamos el parámetro path, para indicar a laravel que solo ejecute esto para un archivo específico &lt;br&gt;
sub(Es posible que en versiones anteriores de Laravel 10 debas comenzar el path con /database)&lt;/p&gt;

&lt;p&gt;Este comando reiniciará la migración específica de grades, eliminando la tabla grades y recreándola de acuerdo con la definición de la migración create_grades_table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Esto modificará el contador de batch, ya que eliminará el registro de migración inicial que tuvo grades_table y lo registrará de nuevo con el nuevo máximo número de batch.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se vería lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dvRNgrLV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2td04i7rd3ca80lzc71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dvRNgrLV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2td04i7rd3ca80lzc71.png" alt="Image description" width="629" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se puede ver, la migración de grades fue eliminada y registrada de nuevo, cambiando su batch de 2 a 4.&lt;/p&gt;

&lt;p&gt;⚠️⚠️ Recuerda, si la migración implica recrear una tabla o columna, la data que existe en la base de datos será eliminada. Este comando se repotencia si usas seeders para llenar nuevamente la tabla.⚠️⚠️&lt;/p&gt;

&lt;p&gt;&lt;span&gt; 🎉¡Felicidades!, ahora sabes como realizar un migrate:refresh específico.&lt;/span&gt; 🥳&lt;/p&gt;

&lt;h2&gt;
  
  
  Ajá. ¿Pero que hago con esto? 🤡
&lt;/h2&gt;

&lt;p&gt;Este comando te ayudará a corregir una migración sin tener que deshacer migraciones posteriores a estas. Asi no necesitarás crear nuevas migraciones, lo que conlleva a crear procesos innecesarios en tu desarrollo.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
