pgroll é uma ferramenta de linha de comando de código aberto que oferece migrações de esquema seguro e reversível para o PostgreSQL, servindo várias versões de esquema simultaneamente. Ele cuida das operações complexas de migração para garantir que os aplicativos do cliente continuem funcionando enquanto o esquema do banco de dados está sendo atualizado. Isso inclui garantir que as alterações sejam aplicadas sem bloquear o banco de dados e que as versões antigas e novas do esquema funcionem simultaneamente (mesmo quando as mudanças de quebra estão sendo feitas!). Isso remove os riscos relacionados às migrações de esquema e simplifica bastante o lançamento de aplicativos do cliente, permitindo também reversões instantâneas.
Veja a postagem introdutória do blog para obter mais informações sobre os problemas resolvidos por pgroll .
pgroll funciona criando esquemas virtuais usando as visualizações sobre as tabelas físicas. Isso permite executar todas as alterações necessárias para uma migração sem afetar os clientes existentes.

pgroll segue um fluxo de trabalho de expansão/contrato. No início da migração, ele executará todas as alterações aditivas (criar tabelas, adicionar colunas etc.) no esquema físico, sem quebrá -lo.
Quando uma mudança de ruptura é necessária em uma coluna, ela cria uma nova coluna no esquema físico e a preenche a coluna antiga. Além disso, configure gatilhos para garantir que todas as gravações para a coluna antiga/nova sejam propagadas para sua contraparte durante todo o período de migração ativa. A nova coluna será então exposta na nova versão do esquema.
Depois que a fase de início estiver concluída, a nova versão do esquema está pronta, mapeando todas as visualizações para as tabelas e colunas adequadas. Os aplicativos do cliente podem acessar a nova versão do esquema, enquanto o antigo ainda está disponível. Este é o momento para começar a lançar a nova versão do aplicativo cliente.

Quando não há mais aplicativos do cliente usando a versão antiga do esquema, a migração pode ser concluída. Isso removerá o esquema antigo, e o novo será o único disponível. As tabelas e colunas não necessárias serão removidas (nenhum cliente está usando isso neste momento) e as novas serão renomeadas para seus nomes finais. Os aplicativos do cliente ainda funcionam durante esta fase, pois as visualizações ainda estão mapeando para as tabelas e colunas adequadas.
Os binários estão disponíveis para Linux, MacOS & Windows, verifique nossos lançamentos.
Para instalar pgroll da fonte, execute o seguinte comando:
go install github.com/xataio/pgroll@latestNota: Requer ir 1,23 ou posterior.
Para instalar pgroll com o HomeBrew, execute o seguinte comando:
# macOS or Linux
brew tap xataio/pgroll
brew install pgroll Siga estas etapas para executar sua primeira migração de esquema usando pgroll :
pgroll precisa armazenar algum estado interno no banco de dados. Uma tabela é criada para rastrear a versão atual do esquema e armazenar o histórico da versão. Para preparar o banco de dados, execute o seguinte comando:
pgroll init --postgres-url postgres://user:password@host:port/dbname Crie um arquivo de migração. Você pode verificar a pasta Exemplos para alguns exemplos. Por exemplo, use este arquivo de migração para criar uma tabela de novos 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
}
]
}
}
]
}Em seguida, execute o seguinte comando para iniciar a migração:
pgroll --postgres-url postgres://user:password@host:port/dbname start initial_migration.jsonIsso criará uma nova versão de esquema no banco de dados e aplicará as operações de migração (crie uma tabela). Depois que esse comando terminar, a versão antiga do esquema (sem tabela de clientes) e a nova (com a tabela de clientes) estarão acessíveis simultaneamente.
Depois de iniciar uma migração, os aplicativos do cliente podem começar a usar a nova versão do esquema. Para fazer isso, eles precisam ser configurados para acessá -lo. Isso pode ser feito definindo o search_path para o novo nome da versão do esquema (fornecido pela saída pgroll start ), por exemplo:
SET search_path TO ' public_initial_migration ' ;Uma vez que não houver mais aplicativos do cliente usando a versão antiga do esquema, a migração pode ser concluída. Isso removerá o esquema antigo. Para concluir a migração, execute o seguinte comando:
pgroll --postgres-url postgres://user:password@host:port/dbname completeEm qualquer momento durante uma migração, ele pode ser revertido para a versão anterior. Isso removerá o novo esquema e deixará o antigo como era antes do início da migração. Para reverter uma migração, execute o seguinte comando:
pgroll --postgres-url postgres://user:password@host:port/dbname rollbackPara uso mais avançado, tutoriais e opções detalhadas, consulte os guias e referências na documentação.
Alguns benchmarks de desempenho são executados em cada compromisso com main para rastrear o desempenho ao longo do tempo. Cada referência é executada contra as postgres 14.8, 15.3, 16.4, 17.0 e "mais recente". Cada linha no gráfico representa o número de linhas nas quais a referência foi executada, atualmente 10k, 100k e 300k linhas.
Backfill: linhas/s para atingir uma coluna de texto com o placeholder o valor. Utilizamos nossa estratégia de lotes padrão de 10k linhas por lote sem retirada.WriteAmplification/NoTrigger: linhas de linha de base/s ao escrever dados em uma tabela sem um gatilho pgroll .WriteAmplification/WithTrigger: linhas/s ao escrever dados em uma tabela quando um gatilho pgroll foi configurado.ReadSchema: verifica o número de execuções por segundo da função read_schema , que é uma função principal executada com frequência durante as migrações.Eles podem ser vistos aqui.
Congratulamo -nos com contribuições da comunidade! Se você quiser contribuir com pgroll , siga estas diretrizes:
Para este projeto, prometemos agir e interagir de maneiras que contribuem para uma comunidade aberta, acolhedora, diversa, inclusiva e saudável.
Esta é uma lista de projetos e artigos que ajudaram como inspiração, ou de outra forma são semelhantes ao pgroll :
Este projeto está licenciado sob a licença Apache 2.0 - consulte o arquivo de licença para obter detalhes.
Se você tiver alguma dúvida, encontrar problemas ou precisar de assistência, abra um problema neste repositório, junte -se à nossa discórdia, e nossa comunidade ficará feliz em ajudar.
Feito com ❤️ por xata?