- 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
Parece que o pgrx mudou de nome a partir do pgx.
Um projeto semelhante é o sqlite-loadable-rs do sqlite.
Disseram que usaram
pgrxem pglite-fusion - Incorporando SQLite em tabelas do PostgreSQL, então fui procurar mais sobre ele.