DuckDB 데이터베이스 직접 읽기

DuckDB 데이터베이스 직접 읽기 (Directly Read DuckDB Databases - read-duckdb)

DuckDB는 자신이 만든 .duckdb 또는 .db 데이터베이스 파일을 직접 읽어 쿼리할 수 있어요. 별도로 연결(attach)하지 않고도 read_duckdb 함수로 테이블을 바로 조회할 수 있죠. 이 페이지에서는 그 사용법을 하나씩 살펴볼게요.

출처: DuckDB 공식 문서 — read-duckdb

개요 (Overview)

read_duckdb 함수는 다음과 같은 과정을 거쳐 작동해요.

  • 읽기 전용 연결(read-only connection) 로 데이터베이스에 연결합니다.
  • table_name 인자로 지정된 테이블을 쿼리합니다.
  • 쿼리 후 해당 데이터베이스와의 연결을 닫습니다.

예제 (Examples)

특정 테이블 읽기 (Reading a Specific Table)

TPC-H 데이터셋의 region 테이블을 읽어볼게요.

SELECT r_regionkey, r_name
FROM read_duckdb('https://blobs.duckdb.org/data/tpch-sf10.db', table_name = 'region');
┌─────────────┬─────────────┐
│ r_regionkey │   r_name    │
│    int32    │   varchar   │
├─────────────┼─────────────┤
│           0 │ AFRICA      │
│           1 │ AMERICA     │
│           2 │ ASIA        │
│           3 │ EUROPE      │
│           4 │ MIDDLE EAST │
└─────────────┴─────────────┘

이렇게 원격 URL에서 바로 데이터를 읽어올 수 있다는 점이 DuckDB의 큰 매력이에요.

여러 데이터베이스에서 읽기 (Reading from Multiple Databases)

글로빙(globbing) 패턴을 쓰면 여러 데이터베이스 파일을 한 번에 읽을 수 있어요. 예시를 위해 두 개의 데이터베이스를 먼저 만들어볼게요.

duckdb my-1.duckdb \
    -c "CREATE TABLE numbers AS SELECT 42 AS x;" \
    -c "CREATE TABLE letters AS SELECT 'm' AS a;"

duckdb my-2.duckdb \
    -c "CREATE TABLE numbers AS SELECT 43 AS x;"

그다음 DuckDB에서 와일드카드 *를 써서 두 파일을 함께 조회해요.

SELECT x FROM read_duckdb('my-*.duckdb', table_name = 'numbers');
┌───────┐
│   x   │
│ int32 │
├───────┤
│    42 │
│    43 │
└───────┘

보시다시피 my-1.duckdb42my-2.duckdb43이 함께 합쳐져 나오는 걸 확인할 수 있죠.

테이블이 하나뿐인 데이터베이스 읽기 (Reading from Databases with a Single Table)

read_duckdb 인자에 넣은 모든 데이터베이스가 테이블을 하나만 가진다면 table_name 인자는 생략할 수 있어요.

FROM read_duckdb('my-2.duckdb');
┌───────┐
│   x   │
│ int32 │
├───────┤
│     3 │
└───────┘

확장자가 .db 또는 .duckdb라면 read_duckdb 호출 자체도 생략하고(마치 read_csvread_parquet를 생략하듯이) 파일 경로만 써서 읽을 수 있어요.

FROM 'my-2.duckdb';

제약 사항 (Limitations)

read_duckdb는 현재 테이블에서만 읽기를 지원해요. 뷰(view)에서 읽는 것은 아직 지원되지 않아요. 만약 뷰를 읽으려 하면 오류가 발생할 거예요. (확인 필요: 향후 버전에서 지원 여부가 바뀔 수 있어요.)

더 알아보기 (Learn more)