pgrx - Framework para desenvolver extensões do PostgreSQL com Rust
(github.com/pgcentralfoundation)- 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-pgrxcargo pgrx new: cria uma nova extensãocargo pgrx init: registra e gerencia instalações do PostgreSQLcargo pgrx run: executa e testa a extensãocargo pgrx test: testa em várias versões do PostgreSQLcargo 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!eextension_sql_file!
- Segurança em primeiro lugar
- O
panic!do Rust é traduzido paraERRORdo 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!eelog(ERROR) - A macro
#[pg_guard]oferece integração estável entre Rust e PostgreSQL - O
Datumdo Postgres éOption<T> where T: FromDatum NULLDatumé representado com segurança comoOption::<T>::None
- O
- 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
- A anotação
- 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
Datumpertencente ao contexto da SPI
- Recursos avançados
- Acesso seguro ao sistema
MemoryContextdo Postgres por meio depgrx::PgMemoryContexts - Hooks de executor/planner/transação/subtransação
- Uso de
unsafedo Rust para acessar funcionalidades internas do PostgreSQL viapgrx::pg_sys
- Acesso seguro ao sistema
- 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.