Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Polars database reader/writer record file metadata, so SQL lineage is missing

Đang mở
#1,740 2 bình luận 0 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 2 ngày

@Dev-iL đang làm issue này rồi.

Từ ngày 27/9/2026.

  • #1743 của @Dev-iL — đang mở

Đánh giá

Issue này chưa được đánh giá.

Mô tả

Related: #1720

PolarsDatabaseReader and PolarsDatabaseWriter (in both polars_post_1_0_0_extensions.py and polars_pre_1_0_0_extension.py) describe database I/O with get_file_and_dataframe_metadata. They pass the SQL query or table name in where a file path is expected:

# PolarsDatabaseReader.load_data
metadata = utils.get_file_and_dataframe_metadata(self.query, df)
# PolarsDatabaseWriter.save_data
return utils.get_file_and_dataframe_metadata(self.table_name, data)

This happens whatever connection is passed, including a SQLAlchemy Engine.

Effects

  • The metadata has no sql_metadata block. So the OpenLineageAdapter can't identify the tables, and sql_dataset_identity="datasource" (from #1720) resolves nothing: sql_datasets() returns SQL datasource is unknown; no dataset emitted.
  • Lineage treats database I/O as filesystem I/O:
    • a read becomes an input dataset named after the node (e.g. orders_df), with storageLayer="FileSystem" and the SQL text as its dataSource URI;
    • a write becomes an output dataset named after the table, also marked FileSystem;
    • no sql job facet is emitted.
  • file_metadata carries meaningless values, e.g. path: "SELECT * FROM orders", scheme: "", and a note that the file does not exist.

Reproduction

import polars as pl
from sqlalchemy import create_engine
from hamilton.plugins.polars_post_1_0_0_extensions import PolarsDatabaseReader

engine = create_engine("sqlite:///a.db")  # with a table `orders`
df, md = PolarsDatabaseReader(query="SELECT * FROM orders", connection=engine).load_data(pl.DataFrame)
print(sorted(md))                  # ['dataframe_metadata', 'file_metadata']
print(md["file_metadata"]["path"])  # 'SELECT * FROM orders'

Proposed fix

  1. In both Polars database classes, record get_sql_metadata(query_or_table, results, db_connection=self.connection, operation="read" | "write") plus get_dataframe_metadata, as PandasSqlReader and PandasSqlWriter do. SQLAlchemy URLs, Engines and Connections, and sqlite3 connections, then get full datasource identity.
  2. Extend get_sql_source to recognise the other connections Polars accepts (ADBC connections, connectorx URI strings, cursors). Until then these are left out of lineage with a note, which is safe but gives no lineage.
  3. Add Polars read and write tests against SQLite, mirroring the pandas SQL lineage tests.

Compatibility

Metadata for Polars database I/O changes from file_metadata to sql_metadata. Default-mode ("legacy") OpenLineage output changes with it: the fake filesystem datasets are replaced by the legacy SQL datasets. Anyone consuming file_metadata from these classes would be affected, so this probably deserves a changelog entry.

Ngôn ngữ chính
Jupyter Notebook
Star
2.6k
Fork
218
Merge trung bình
2 ngày 13 giờ
Pull request đã merge (30 ngày)
18

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của apache/hamilton

Tất cả issue của apache/hamilton

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.