- Rust로 PostgreSQL 확장을 개발 가능, 최대한 Idiomatic & Safe 하기 위해 노력
-
cargo-pgrx
로 완전 관리되는 개발 환경 지원
-
cargo pgrx new
: 새로운 확장 생성
-
cargo pgrx init
: PostgreSQL 설치 등록 및 관리
-
cargo pgrx run
: 확장 실행 및 테스트
-
cargo pgrx test
: 여러 PostgreSQL 버전에서 테스트
-
cargo pgrx package
: 확장 설치 패키지 생성
- 다중 PostgreSQL 버전 지원
- 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
로 표현됨
- First-class UDF support
-
#[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에 안전하게 접근 가능
- 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 호환되지 않으면 에러 발생 가능