Làm việc với cơ sở dữ liệu

Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Liam Brannigan

Data Scientist & Polars Contributor

Truy vấn CSDL từ Polars

Sơ đồ khái niệm: Polars gửi truy vấn SQL và uri tới cơ sở dữ liệu.

Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Truy vấn CSDL từ Polars

Sơ đồ khái niệm: Polars gửi truy vấn SQL tới CSDL và nhận bảng kết quả qua một engine CSDL.

Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Các CSDL Polars có thể truy vấn

Các CSDL Polars có thể làm việc cùng

  • Embedded → chạy cục bộ, không cần server
  • DuckDB → CSDL phân tích
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Bảng giấy phép xây dựng

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  |
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

URI kết nối

import polars as pl

uri = "postgresql://analyst:[email protected]:5432/buildings"
  • Giao thức postgresql://
  • Tên người dùng và mật khẩu analyst:secret
  • Máy chủ và cổng data.chicago.org:5432
  • Tên CSDL buildings
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Truy vấn cơ sở dữ liệu

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







Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Truy vấn cơ sở dữ liệu

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)



)
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Truy vấn cơ sở dữ liệu

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)
)
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Đếm giấy phép theo nhóm

permit_counts
shape: (3, 2)
| permit_type                     | len |
| ---                             | --- |
| str                             | u32 |
|---------------------------------|-----|
| Easy Permit                     | 58  |
| New Construction                | 14  |
| Renovation                      | 11  |
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Chọn engine phù hợp

pl.read_database_uri(
    query=query,
    uri=uri,
    engine="connectorx",
)
  • Hỗ trợ nhiều CSDL hơn
pl.read_database_uri(
    query=query,
    uri=uri,
    engine="adbc",
)
  • Nhanh hơn với CSDL được hỗ trợ
1 https://arrow.apache.org/adbc/current/driver/status.html
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Ghi trở lại cơ sở dữ liệu

permit_counts.write_database(



)
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Ghi trở lại cơ sở dữ liệu

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

)
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Ghi trở lại cơ sở dữ liệu

permit_counts.write_database(
    table_name="permit_type_summary",
    connection=uri,
    if_table_exists="replace",
)
  • append
  • fail
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Tích hợp DuckDB

import duckdb

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


$$

  • DuckDB → đầu ra Polars tích hợp sẵn
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Tích hợp 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  |
Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Ayo berlatih!

Mở rộng và tối ưu hóa pipeline dữ liệu với Polars

Preparing Video For Download...