9P by xguru 8일전 | favorite | 댓글 2개
  • 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 DatumOption<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 호환되지 않으면 에러 발생 가능

pgrx는 pgx에서 이름을 바꾼 것 같네요.
비슷한 프로젝트로는 sqlite의 sqlite-loadable-rs가 있습니다.

pglite-fusion - PostgreSQL 테이블에 SQLite 임베딩하기 여기서 pgrx 를 썼다고 해서 찾아봤습니다.