Pgrx
Rust로 PostgreSQL 확장을 개발하는 프레임워크
기존 pgx에서 개명한듯?
Features
- Rust로 PostgreSQL 확장을 개발 가능, 최대한 Idiomatic & Safe 하기 위해 노력
- cargo-pgrx 로 완전 관리되는 개발 환경 지원
- cargo pgrx new: 새로운 확장 생성
- cargo pgrx init: PostgreSQL 설치 등록 및 관리
- cargo pgrx run: 확장 실행 및 테스트
- cargo pgrx test: 여러 PostgreSQL 버전에서 테스트
- cargo pgrx package: 확장 설치 패키지 생성
- PostgreSQL 12부터 17까지 지원
- Rust 피쳐 게이팅을 통해 버전별 API를 선택적으로 사용 가능
- 모든 버전에 대해 통합 테스트 가능
- Rust만으로 확장 구현 가능
- 많은 Rust Type들을 PostgreSQL용으로 자동 매핑
- SQL 스키마를 자동으로 생성하거나 cargo pgrx schema로 수동 생성 가능
- extension_sql! 및 extension_sql_file! 매크로를 통해 커스텀 SQL 포함 가능
- Rust의 panic!이 PostgreSQL ERROR로 번역되어 프로세스가 아닌 트랜잭션만 중단
- Rust 메모리 관리 모델 유지 - panic! 및 elog(ERROR) 에서도
- #[pg_guard] 매크로로 Rust와 PostgreSQL의 안정적 연동 지원
- Postgres Datum은 Option<T> where T: FromDatum
- NULL Datum은 안전하게 Option::<T>::None로 표현됨
- #[pg_extern] 어노테이션으로 Rust 함수(Postgres 사용자 정의 함수)를 PostgreSQL에 노출 가능
- #[pg_trigger] 로 트리거 함수 생성
- #[derive(PostgresType)] 로 Rust 구조체를 PostgreSQL 타입으로 사용:
- 메모리/디스크 상에서는 CBOR로 인코딩되고, 사람이 읽을 수 있는 형태로는 JSON으로 표현
- 커스텀 메모리/디스크/JSON 표현 방식 정의 가능
- #[derive(PostgresEnum)] 로 Rust Enum을 PostgreSQL enum으로 사용:
- pgrx::composite_type!("Sample") 매크로를 통해 복합 타입 지원
- SPI에 안전하게 접근 가능
- SPI 컨텍스트에서 소유된 Datum을 투명하게 반환 가능
- pgrx::PgMemoryContexts 를 통해 Postgres의 MemoryContext 시스템에 안전하게 액세스
- Executor/planner/transaction/subtransaction 후크
- Rust의 unsafe를 활용하여 pgrx::pg_sys를 통해 PostgreSQL 내부 기능 접근 가능
- 멀티스레딩 미지원: Postgres는 기본적으로 단일 스레드 기반이며, 스레드가 Postgres 함수에 접근할 경우 충돌 가능
- 비동기 지원 미완성: async 문맥에서 Postgres와의 상호작용 연구가 부족함
- Windows 지원 부족: 현재 Windows에서 완벽히 작동하지 않음
- UTF-8 인코딩 필수: Postgres 데이터베이스가 UTF-8 호환되지 않으면 에러 발생 가능
See also
- Rust
- PostgreSQL
- sqlite-loadable-rs - SQLite확장을 Rust로 작성하게 해주는 프레임워크
- pglite-fusion - PostgreSQL 테이블에 SQLite 임베딩하기 (pgrx를 사용한듯?)