From c8b9ca1d9c7391d19b90cdd902f743fd541d4b47 Mon Sep 17 00:00:00 2001 From: Albert Date: Thu, 4 Jun 2026 20:31:31 +0200 Subject: [PATCH 1/2] fix(api): use upsert endpoint --- README.md | 6 +++--- src/altertable_lakehouse/client.py | 13 ++++++------- src/altertable_lakehouse/models.py | 6 ------ tests/test_client.py | 2 +- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index e4c329a..7671cb2 100644 --- a/README.md +++ b/README.md @@ -61,16 +61,16 @@ if res.task_id: ### Upload ```python -from altertable_lakehouse.models import UploadFormat, UploadMode +from altertable_lakehouse.models import UploadMode with open("data.csv", "rb") as f: client.upload( catalog="my_cat", schema="my_schema", table="my_table", - format=UploadFormat.CSV, mode=UploadMode.APPEND, - content=f.read() + content=f.read(), + content_type="text/csv" ) ``` diff --git a/src/altertable_lakehouse/client.py b/src/altertable_lakehouse/client.py index 1a5aed4..b1876d8 100644 --- a/src/altertable_lakehouse/client.py +++ b/src/altertable_lakehouse/client.py @@ -16,7 +16,6 @@ ValidateResponse, AutocompleteRequest, AutocompleteResponse, - UploadFormat, UploadMode, QueryMetadata, QueryResult, @@ -124,26 +123,26 @@ def upload( catalog: str, schema: str, table: str, - format: UploadFormat, - mode: UploadMode, content: bytes, + mode: Optional[UploadMode] = None, primary_key: Optional[str] = None, + content_type: str = "application/octet-stream", ) -> None: params = { "catalog": catalog, "schema": schema, "table": table, - "format": format.value, - "mode": mode.value, } + if mode is not None: + params["mode"] = mode.value if primary_key: params["primary_key"] = primary_key try: res = self._client.post( - "/upload", + "/upsert", params=params, content=content, - headers={"Content-Type": "application/octet-stream"}, + headers={"Content-Type": content_type}, ) self._check_response(res) except httpx.RequestError as e: diff --git a/src/altertable_lakehouse/models.py b/src/altertable_lakehouse/models.py index d69725e..fced3e3 100644 --- a/src/altertable_lakehouse/models.py +++ b/src/altertable_lakehouse/models.py @@ -11,12 +11,6 @@ class ComputeSize(str, Enum): XL = "XL" -class UploadFormat(str, Enum): - CSV = "csv" - JSON = "json" - PARQUET = "parquet" - - class UploadMode(str, Enum): CREATE = "create" APPEND = "append" diff --git a/tests/test_client.py b/tests/test_client.py index f59c404..00157af 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -47,7 +47,7 @@ def test_query_all(client): def test_upload(client): try: - client.upload(catalog="cat", schema="sch", table="tbl", format=models.UploadFormat.JSON, mode=models.UploadMode.APPEND, content=b'{"a":1}') + client.upload(catalog="cat", schema="sch", table="tbl", mode=models.UploadMode.APPEND, content=b'{"a":1}', content_type="application/json") except errors.BadRequestError: pass From 83a3c47ee58aa0ecc64d040440678dd703c970fa Mon Sep 17 00:00:00 2001 From: Albert Date: Wed, 10 Jun 2026 20:07:31 +0000 Subject: [PATCH 2/2] fix(api): rename upload API to upsert --- CHANGELOG.md | 2 +- README.md | 11 +++++------ src/altertable_lakehouse/client.py | 8 +++----- src/altertable_lakehouse/models.py | 2 +- tests/test_client.py | 4 ++-- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99ce0f3..cdbebde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,5 +19,5 @@ All notable changes to this project will be documented in this file. ## [0.1.0] - 2026-03-09 ### Added - Initial release of the Python SDK for the Altertable Lakehouse API. -- Implemented `append`, `upload`, `query`, `query_all`, `validate`, `get_query`, and `cancel_query` methods. +- Implemented `append`, `upsert`, `query`, `query_all`, `validate`, `get_query`, and `cancel_query` methods. - Full typing support with `pydantic` models. diff --git a/README.md b/README.md index 7671cb2..bd085a9 100644 --- a/README.md +++ b/README.md @@ -58,19 +58,18 @@ if res.task_id: print(task.status) ``` -### Upload +### Upsert ```python -from altertable_lakehouse.models import UploadMode +from altertable_lakehouse.models import UpsertMode with open("data.csv", "rb") as f: - client.upload( + client.upsert( catalog="my_cat", schema="my_schema", table="my_table", - mode=UploadMode.APPEND, - content=f.read(), - content_type="text/csv" + mode=UpsertMode.APPEND, + content=f.read() ) ``` diff --git a/src/altertable_lakehouse/client.py b/src/altertable_lakehouse/client.py index b1876d8..8f17153 100644 --- a/src/altertable_lakehouse/client.py +++ b/src/altertable_lakehouse/client.py @@ -16,7 +16,7 @@ ValidateResponse, AutocompleteRequest, AutocompleteResponse, - UploadMode, + UpsertMode, QueryMetadata, QueryResult, ) @@ -118,15 +118,14 @@ def get_task(self, task_id: str) -> TaskResponse: except httpx.RequestError as e: self._handle_error(e) - def upload( + def upsert( self, catalog: str, schema: str, table: str, content: bytes, - mode: Optional[UploadMode] = None, + mode: Optional[UpsertMode] = None, primary_key: Optional[str] = None, - content_type: str = "application/octet-stream", ) -> None: params = { "catalog": catalog, @@ -142,7 +141,6 @@ def upload( "/upsert", params=params, content=content, - headers={"Content-Type": content_type}, ) self._check_response(res) except httpx.RequestError as e: diff --git a/src/altertable_lakehouse/models.py b/src/altertable_lakehouse/models.py index fced3e3..2c4c950 100644 --- a/src/altertable_lakehouse/models.py +++ b/src/altertable_lakehouse/models.py @@ -11,7 +11,7 @@ class ComputeSize(str, Enum): XL = "XL" -class UploadMode(str, Enum): +class UpsertMode(str, Enum): CREATE = "create" APPEND = "append" UPSERT = "upsert" diff --git a/tests/test_client.py b/tests/test_client.py index 00157af..6c38d74 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -45,9 +45,9 @@ def test_query_all(client): assert isinstance(res.columns, list) assert isinstance(res.rows, list) -def test_upload(client): +def test_upsert(client): try: - client.upload(catalog="cat", schema="sch", table="tbl", mode=models.UploadMode.APPEND, content=b'{"a":1}', content_type="application/json") + client.upsert(catalog="cat", schema="sch", table="tbl", mode=models.UpsertMode.APPEND, content=b'{"a":1}') except errors.BadRequestError: pass