pgroll es una herramienta de línea de comandos de código abierto que ofrece migraciones de esquema seguras y reversibles para PostgreSQL al servir múltiples versiones de esquema simultáneamente. Se encarga de las complejas operaciones de migración para garantizar que las aplicaciones de los clientes continúen funcionando mientras se actualiza el esquema de la base de datos. Esto incluye garantizar que se apliquen cambios sin bloquear la base de datos, y que las versiones de esquema antiguas y nuevas funcionan simultáneamente (¡incluso cuando se están realizando cambios!). Esto elimina los riesgos relacionados con las migraciones de esquemas, y simplifica enormemente el despliegue de la aplicación del cliente, lo que también permite reversiones instantáneas.
Vea la publicación de blog introductoria para obtener más información sobre los problemas resueltos por pgroll .
pgroll funciona creando esquemas virtuales mediante el uso de vistas sobre las tablas físicas. Esto permite realizar todos los cambios necesarios para una migración sin afectar a los clientes existentes.

pgroll sigue un flujo de trabajo de expansión/contrato. Al inicio de la migración, realizará todos los cambios aditivos (crear tablas, agregar columnas, etc.) en el esquema físico, sin romperlo.
Cuando se requiere un cambio de ruptura en una columna, creará una nueva columna en el esquema físico y lo rellenará de la columna anterior. Además, configure los desencadenantes para asegurarse de que todas las escrituras a la columna antigua/nueva se propagen a su contraparte durante todo el período de migración activa. La nueva columna se expondrá en la nueva versión del esquema.
Una vez que se completa la fase de inicio, la nueva versión de esquema está lista, asignando todas las vistas a las tablas y columnas adecuadas. Las aplicaciones clientes pueden acceder a la nueva versión de esquema, mientras que la antigua todavía está disponible. Este es el momento para comenzar a implementar la nueva versión de la aplicación cliente.

Cuando no hay más aplicaciones de clientes utilizando la versión de esquema anterior, la migración se puede completar. Esto eliminará el esquema antiguo, y el nuevo será el único disponible. Las tablas y columnas ya no necesarias se eliminarán (ningún cliente lo usa en este punto), y las nuevas pasarán a llamarse a sus nombres finales. Las aplicaciones de los clientes aún funcionan durante esta fase, ya que las vistas aún se asignan a las tablas y columnas adecuadas.
Los binarios están disponibles para Linux, MacOS & Windows, verifique nuestros lanzamientos.
Para instalar pgroll desde la fuente, ejecute el siguiente comando:
go install github.com/xataio/pgroll@latestNota: Requiere Go 1.23 o posterior.
Para instalar pgroll con HomeBrew, ejecute el siguiente comando:
# macOS or Linux
brew tap xataio/pgroll
brew install pgroll Siga estos pasos para realizar su primera migración de esquema usando pgroll :
pgroll necesita almacenar algún estado interno en la base de datos. Se crea una tabla para rastrear la versión de esquema actual y el historial de versiones de la tienda. Para preparar la base de datos, ejecute el siguiente comando:
pgroll init --postgres-url postgres://user:password@host:port/dbname Crear un archivo de migración. Puede verificar la carpeta de ejemplos para obtener algunos ejemplos. Por ejemplo, use este archivo de migración para crear una nueva tabla de customers :
{
"name" : " initial_migration " ,
"operations" : [
{
"create_table" : {
"name" : " customers " ,
"columns" : [
{
"name" : " id " ,
"type" : " integer " ,
"pk" : true
},
{
"name" : " name " ,
"type" : " varchar(255) " ,
"unique" : true
},
{
"name" : " bio " ,
"type" : " text " ,
"nullable" : true
}
]
}
}
]
}Luego ejecute el siguiente comando para iniciar la migración:
pgroll --postgres-url postgres://user:password@host:port/dbname start initial_migration.jsonEsto creará una nueva versión de esquema en la base de datos y aplicará las operaciones de migración (crear una tabla). Después de que termine este comando, tanto la versión anterior del esquema (sin tabla de clientes) como la nueva (con la tabla de clientes) serán accesibles simultáneamente.
Después de comenzar una migración, las aplicaciones de clientes pueden comenzar a usar la nueva versión de esquema. Para hacerlo, deben configurarse para acceder a él. Esto se puede hacer configurando la search_path en el nombre de la versión del nuevo esquema (proporcionado por la salida pgroll start ), por ejemplo:
SET search_path TO ' public_initial_migration ' ;Una vez que no hay más aplicaciones de clientes utilizando la versión de esquema antiguo, la migración se puede completar. Esto eliminará el antiguo esquema. Para completar la migración, ejecute el siguiente comando:
pgroll --postgres-url postgres://user:password@host:port/dbname completeEn cualquier momento durante una migración, se puede volver a la versión anterior. Esto eliminará el nuevo esquema y dejará el viejo como lo fue antes de que comenzara la migración. Para revertir una migración, ejecute el siguiente comando:
pgroll --postgres-url postgres://user:password@host:port/dbname rollbackPara un uso más avanzado, tutoriales y opciones detalladas, consulte las guías y referencias en la documentación.
Algunos puntos de referencia de rendimiento se ejecutan en cada compromiso con main para rastrear el rendimiento con el tiempo. Cada punto de referencia se ejecuta contra Postgres 14.8, 15.3, 16.4, 17.0 y "Último". Cada línea en la tabla representa el número de filas contra las que se ejecutó el punto de referencia, actualmente 10k, 100k y 300k filas.
Backfill: filas/s para rellenar una columna de texto con el placeholder de valor. Utilizamos nuestra estrategia de lotes predeterminada de 10k filas por lote sin retroceso.WriteAmplification/NoTrigger: filas de línea de base al escribir datos en una tabla sin un disparador pgroll .WriteAmplification/WithTrigger: filas/s al escribir datos en una tabla cuando se ha configurado un disparador pgroll .ReadSchema: verifica el número de ejecuciones por segundo de la función read_schema , que es una función central ejecutada con frecuencia durante las migraciones.Se pueden ver aquí.
¡Agradecemos las contribuciones de la comunidad! Si desea contribuir a pgroll , siga estas pautas:
Para este proyecto, nos comprometemos a actuar e interactuar de manera que contribuya a una comunidad abierta, acogedora, diversa, inclusiva y saludable.
Esta es una lista de proyectos y artículos que ayudaron como inspiración, o de otra manera son similares a pgroll :
Este proyecto tiene licencia bajo la licencia APACHE 2.0; consulte el archivo de licencia para obtener más detalles.
Si tiene alguna pregunta, encuentra problemas o necesita ayuda, abra un problema en este repositorio, nuestro unión a nuestra discordia, y nuestra comunidad estará encantada de ayudarlo.
Hecho con ❤️ por xata?