# pgrx - Rust로 PostgreSQL 확장을 개발하는 프레임워크

> Clean Markdown view of GeekNews topic #17864. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17864](https://news.hada.io/topic?id=17864)
- GeekNews Markdown: [https://news.hada.io/topic/17864.md](https://news.hada.io/topic/17864.md)
- Type: news
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2024-11-20T10:05:01+09:00
- Updated: 2024-11-20T10:05:01+09:00
- Original source: [github.com/pgcentralfoundation](https://github.com/pgcentralfoundation/pgrx)
- Points: 9
- Comments: 2

## Summary

pgrx는 Rust로 PostgreSQL 확장을 개발할 수 있는 프레임워크로, 안전성과 편리성을 강조하며 다양한 PostgreSQL 버전을 지원합니다. `cargo-pgrx`를 통해 개발 환경을 완전 관리할 수 있으며, 자동 스키마 생성과 사용자 정의 타입 지원 등의 기능을 제공합니다. 그러나 멀티스레딩 미지원, 비동기 지원 미완성, Windows 지원 부족 등의 한계가 있습니다.

## Topic Body

- 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&lt;T&gt; where T: FromDatum`  
  - `NULL` Datum은 안전하게 `Option::&lt;T&gt;::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 호환되지 않으면 에러 발생 가능

## Comments



### Comment 31531

- Author: secret3056
- Created: 2024-11-20T14:05:56+09:00
- Points: 1

pgrx는 [pgx](https://news.hada.io/topic?id=2448)에서 이름을 바꾼 것 같네요.  
비슷한 프로젝트로는 sqlite의 [sqlite-loadable-rs](https://news.hada.io/topic?id=8055)가 있습니다.

### Comment 31522

- Author: xguru
- Created: 2024-11-20T10:12:00+09:00
- Points: 1

[pglite-fusion - PostgreSQL 테이블에 SQLite 임베딩하기](https://news.hada.io/topic?id=17858) 여기서 pgrx 를 썼다고 해서 찾아봤습니다.
