DuckDB 데이터베이스 직접 읽기
DuckDB 데이터베이스 직접 읽기 (Directly Read DuckDB Databases - read-duckdb)
DuckDB는 자신이 만든 .duckdb 또는 .db 데이터베이스 파일을 직접 읽어 쿼리할 수 있어요. 별도로 연결(attach)하지 않고도 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.duckdb의 42와 my-2.duckdb의 43이 함께 합쳐져 나오는 걸 확인할 수 있죠.
테이블이 하나뿐인 데이터베이스 읽기 (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_csv나 read_parquet를 생략하듯이) 파일 경로만 써서 읽을 수 있어요.
FROM 'my-2.duckdb';
제약 사항 (Limitations)
read_duckdb는 현재 테이블에서만 읽기를 지원해요. 뷰(view)에서 읽는 것은 아직 지원되지 않아요. 만약 뷰를 읽으려 하면 오류가 발생할 거예요. (확인 필요: 향후 버전에서 지원 여부가 바뀔 수 있어요.)