9 pontos por xguru 2024-11-20 | 2 comentários | Compartilhar no WhatsApp
  • Permite desenvolver extensões do PostgreSQL com Rust, buscando ser o mais idiomático e seguro possível
  • Suporte a um ambiente de desenvolvimento totalmente gerenciado com cargo-pgrx
    • cargo pgrx new: cria uma nova extensão
    • cargo pgrx init: registra e gerencia instalações do PostgreSQL
    • cargo pgrx run: executa e testa a extensão
    • cargo pgrx test: testa em várias versões do PostgreSQL
    • cargo pgrx package: cria um pacote de instalação da extensão
  • Suporte a múltiplas versões do PostgreSQL
    • Suporte do PostgreSQL 12 ao 17
    • Permite usar seletivamente APIs por versão por meio de Rust feature gating
    • Permite testes integrados em todas as versões
  • Geração automática de schema
    • É possível implementar a extensão apenas com Rust
    • Muitos tipos de Rust são mapeados automaticamente para PostgreSQL
    • O schema SQL pode ser gerado automaticamente ou manualmente com cargo pgrx schema
    • É possível incluir SQL customizado com as macros extension_sql! e extension_sql_file!
  • Segurança em primeiro lugar
    • O panic! do Rust é traduzido para ERROR do PostgreSQL, interrompendo apenas a transação, e não o processo
    • Mantém o modelo de gerenciamento de memória do Rust, inclusive em panic! e elog(ERROR)
    • A macro #[pg_guard] oferece integração estável entre Rust e PostgreSQL
    • O Datum do Postgres é Option<T> where T: FromDatum
    • NULL Datum é representado com segurança como Option::<T>::None
  • Suporte de primeira classe a UDFs
    • A anotação #[pg_extern] permite expor funções Rust (funções definidas pelo usuário no Postgres) ao PostgreSQL
    • #[pg_trigger] cria funções de gatilho
  • Suporte a tipos definidos pelo usuário
    • #[derive(PostgresType)] permite usar structs Rust como tipos do PostgreSQL:
      • Na memória/no disco, são codificados em CBOR e, em formato legível por humanos, representados como JSON
      • É possível definir formas customizadas de representação em memória/no disco/JSON
      • #[derive(PostgresEnum)] permite usar enums Rust como enums do PostgreSQL
      • Suporte a tipos compostos por meio da macro pgrx::composite_type!("Sample")
  • Server Programming Interface (SPI)
    • Acesso seguro à SPI
    • Permite retornar de forma transparente Datum pertencente ao contexto da SPI
  • Recursos avançados
    • Acesso seguro ao sistema MemoryContext do Postgres por meio de pgrx::PgMemoryContexts
    • Hooks de executor/planner/transação/subtransação
    • Uso de unsafe do Rust para acessar funcionalidades internas do PostgreSQL via pgrx::pg_sys
  • Limitações e problemas conhecidos
    • Sem suporte a multithreading: o Postgres é baseado em thread única por padrão, e pode haver falhas se threads acessarem funções do Postgres
    • Suporte assíncrono incompleto: ainda há pouca pesquisa sobre interação com o Postgres em contexto async
    • Suporte insuficiente no Windows: atualmente não funciona perfeitamente no Windows
    • Codificação UTF-8 obrigatória: pode ocorrer erro se o banco de dados Postgres não for compatível com UTF-8

2 comentários

 
secret3056 2024-11-20

Parece que o pgrx mudou de nome a partir do pgx.
Um projeto semelhante é o sqlite-loadable-rs do sqlite.

 
xguru 2024-11-20

Disseram que usaram pgrx em pglite-fusion - Incorporando SQLite em tabelas do PostgreSQL, então fui procurar mais sobre ele.