데이터베이스 작업

Polars로 데이터 파이프라인 확장 및 최적화하기

Liam Brannigan

Data Scientist & Polars Contributor

Polars에서 데이터베이스 쿼리하기

Polars가 SQL 쿼리와 uri를 데이터베이스에 전송하는 개념도

Polars로 데이터 파이프라인 확장 및 최적화하기

Polars에서 데이터베이스 쿼리하기

Polars가 데이터베이스에 SQL 쿼리를 전송하고 데이터베이스 엔진을 통해 결과 테이블을 받는 개념도

Polars로 데이터 파이프라인 확장 및 최적화하기

Polars가 쿼리할 수 있는 데이터베이스

Polars가 사용할 수 있는 데이터베이스

  • 임베디드 → 로컬 실행, 서버 불필요
  • DuckDB분석용 데이터베이스
Polars로 데이터 파이프라인 확장 및 최적화하기

건축 허가 테이블

SELECT *
FROM building_permits
LIMIT 5
shape: (5, 5)
| issue_date | permit_type | review_type | street_name  | work_description             |
| ---        | ---         | ---         | ---          | ---                          |
| date       | str         | str         | str          | str                          |
|------------|-------------|-------------|--------------|------------------------------|
| 2026-04-30 | Signs       | SIGN PERMIT | CLARK ST     | Wall sign install            |
| 2026-04-28 | Renovation  | SELF CERT   | OAKLEY AVE   | Add dormer to 8-unit roof    |
| 2026-03-21 | Easy Permit | EASY PERMIT | SEMINARY AVE | Parapet masonry repair       |
| 2026-03-11 | Easy Permit | EASY PERMIT | RHODES AVE   | Rebuild south chimney side   |
| 2026-03-03 | Easy Permit | EASY PERMIT | GIDDINGS ST  | Porch lintel + tuckpointing  |
Polars로 데이터 파이프라인 확장 및 최적화하기

연결 URI

import polars as pl

uri = "postgresql://analyst:[email protected]:5432/buildings"
  • postgresql:// 프로토콜
  • analyst:secret 사용자 이름 및 비밀번호
  • data.chicago.org:5432 호스트 및 포트
  • buildings 데이터베이스 이름
Polars로 데이터 파이프라인 확장 및 최적화하기

데이터베이스 쿼리

query = """
    SELECT issue_date, permit_type
    FROM building_permits
    WHERE issue_date >= DATE '2026-01-01'
"""







Polars로 데이터 파이프라인 확장 및 최적화하기

데이터베이스 쿼리

query = """
    SELECT issue_date, permit_type
    FROM building_permits
    WHERE issue_date >= DATE '2026-01-01'
"""

permit_counts = (
    pl.read_database_uri(query=query, uri=uri)



)
Polars로 데이터 파이프라인 확장 및 최적화하기

데이터베이스 쿼리

query = """
    SELECT issue_date, permit_type
    FROM building_permits
    WHERE issue_date >= DATE '2026-01-01'
"""

permit_counts = (
    pl.read_database_uri(query=query, uri=uri)
    .group_by("permit_type")
    .len()
    .sort("len", descending=True)
)
Polars로 데이터 파이프라인 확장 및 최적화하기

허가 유형별 그룹 집계

permit_counts
shape: (3, 2)
| permit_type                     | len |
| ---                             | --- |
| str                             | u32 |
|---------------------------------|-----|
| Easy Permit                     | 58  |
| New Construction                | 14  |
| Renovation                      | 11  |
Polars로 데이터 파이프라인 확장 및 최적화하기

엔진 선택

pl.read_database_uri(
    query=query,
    uri=uri,
    engine="connectorx",
)
  • 더 많은 데이터베이스 지원
pl.read_database_uri(
    query=query,
    uri=uri,
    engine="adbc",
)
  • 지원 데이터베이스에서 더 빠름
1 https://arrow.apache.org/adbc/current/driver/status.html
Polars로 데이터 파이프라인 확장 및 최적화하기

데이터베이스에 다시 쓰기

permit_counts.write_database(



)
Polars로 데이터 파이프라인 확장 및 최적화하기

데이터베이스에 다시 쓰기

permit_counts.write_database(
    table_name="permit_type_summary",
    connection=uri,

)
Polars로 데이터 파이프라인 확장 및 최적화하기

데이터베이스에 다시 쓰기

permit_counts.write_database(
    table_name="permit_type_summary",
    connection=uri,
    if_table_exists="replace",
)
  • append
  • fail
Polars로 데이터 파이프라인 확장 및 최적화하기

DuckDB 통합

import duckdb

db = duckdb.connect("permits.duckdb")


$$

  • DuckDB내장 Polars 출력
Polars로 데이터 파이프라인 확장 및 최적화하기

DuckDB 통합

import duckdb

db = duckdb.connect("permits.duckdb")

result = db.sql("SELECT * FROM permit_type_summary").pl()
shape: (3, 2)
| permit_type                     | len |
| ---                             | --- |
| str                             | u32 |
|---------------------------------|-----|
| Easy Permit                     | 58  |
| New Construction                | 14  |
| Renovation                      | 11  |
Polars로 데이터 파이프라인 확장 및 최적화하기

연습해 봅시다!

Polars로 데이터 파이프라인 확장 및 최적화하기

Preparing Video For Download...