- Rust ile PostgreSQL eklentileri geliştirilebilir; mümkün olduğunca idiomatic ve güvenli olmaya odaklanır
cargo-pgrx ile tamamen yönetilen geliştirme ortamı sağlar
cargo pgrx new: yeni bir eklenti oluşturur
cargo pgrx init: PostgreSQL kurulumlarını kaydeder ve yönetir
cargo pgrx run: eklentiyi çalıştırır ve test eder
cargo pgrx test: birden fazla PostgreSQL sürümünde test eder
cargo pgrx package: eklenti kurulum paketi oluşturur
- Çoklu PostgreSQL sürümü desteği
- PostgreSQL 12 ile 17 arasını destekler
- Rust feature gating ile sürüme özgü API'ler seçmeli olarak kullanılabilir
- Tüm sürümler için entegrasyon testi yapılabilir
- Otomatik şema üretimi
- Eklenti yalnızca Rust ile uygulanabilir
- Birçok Rust tipi PostgreSQL için otomatik olarak eşlenir
- SQL şeması otomatik üretilebilir veya
cargo pgrx schema ile elle üretilebilir
extension_sql! ve extension_sql_file! makrolarıyla özel SQL eklenebilir
- Önce güvenlik
- Rust
panic!, PostgreSQL ERROR'una çevrilir; böylece süreç yerine yalnızca transaction durdurulur
- Rust bellek yönetimi modeli korunur -
panic! ve elog(ERROR) durumlarında da
#[pg_guard] makrosu ile Rust ve PostgreSQL arasında güvenli entegrasyon sağlanır
- Postgres
Datum, Option<T> where T: FromDatum olarak temsil edilir
NULL Datum güvenli şekilde Option::<T>::None olarak ifade edilir
- Birinci sınıf UDF desteği
#[pg_extern] anotasyonuyla Rust fonksiyonları (Postgres kullanıcı tanımlı fonksiyonları) PostgreSQL'e açılabilir
#[pg_trigger] ile trigger fonksiyonları oluşturulabilir
- Kullanıcı tanımlı tip desteği
#[derive(PostgresType)] ile Rust struct'ları PostgreSQL tipi olarak kullanılabilir:
- Bellekte/diskte CBOR ile kodlanır, insan tarafından okunabilir biçimde ise JSON olarak gösterilir
- Özel bellek/disk/JSON gösterim biçimleri tanımlanabilir
#[derive(PostgresEnum)] ile Rust enum'ları PostgreSQL enum'u olarak kullanılabilir
pgrx::composite_type!("Sample") makrosu üzerinden composite type desteği sunulur
- Sunucu Programlama Arayüzü (SPI)
- SPI'ye güvenli şekilde erişilebilir
- SPI bağlamında sahipliği alınmış Datum'lar şeffaf biçimde döndürülebilir
- Gelişmiş özellikler
pgrx::PgMemoryContexts ile Postgres'in MemoryContext sistemine güvenli erişim
- Executor/planner/transaction/subtransaction hook'ları
- Rust
unsafe kullanarak pgrx::pg_sys üzerinden PostgreSQL iç işlevlerine erişim
- Sınırlamalar ve bilinen sorunlar
- Multithreading desteklenmez: Postgres temelde tek iş parçacıklı yapıdadır; thread'ler Postgres fonksiyonlarına erişirse çökme yaşanabilir
- Asenkron destek tamamlanmamış:
async bağlamında Postgres ile etkileşim konusunda yeterli araştırma yoktur
- Windows desteği yetersiz: Şu anda Windows'ta tam olarak çalışmaz
- UTF-8 kodlaması zorunlu: Postgres veritabanı UTF-8 uyumlu değilse hata oluşabilir
2 yorum
Görünüşe göre pgrx, adını pgx olarak değiştirmiş.
Benzer bir proje olarak sqlite için sqlite-loadable-rs var.
pglite-fusion - PostgreSQL tablolarına SQLite gömmek yazısında pgrx kullanıldığı söylenince ben de araştırdım.