Skip to content

Commit a61472b

Browse files
author
Saurabh Badenkal
committed
Strip whitespace from IDs, filter empty update patches, fix README ids[0] reference, use DataFrame index labels in errors
1 parent f7a70d5 commit a61472b

2 files changed

Lines changed: 19 additions & 10 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ new_accounts["telephone1"] = ["555-0199", "555-0299"]
263263
client.dataframe.update("account", new_accounts, id_column="accountid")
264264

265265
# Clear a field by setting clear_nulls=True (by default, NaN/None fields are skipped)
266-
df = pd.DataFrame([{"accountid": ids[0], "websiteurl": None}])
266+
df = pd.DataFrame([{"accountid": new_accounts["accountid"].iloc[0], "websiteurl": None}])
267267
client.dataframe.update("account", df, id_column="accountid", clear_nulls=True)
268268

269269
# Delete records by passing a Series of GUIDs

src/PowerPlatform/Dataverse/operations/dataframe.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from __future__ import annotations
77

8-
from typing import List, Optional, TYPE_CHECKING
8+
from typing import Any, Dict, List, Optional, TYPE_CHECKING
99

1010
import pandas as pd
1111

@@ -245,13 +245,14 @@ def update(
245245
if id_column not in changes.columns:
246246
raise ValueError(f"id_column '{id_column}' not found in DataFrame columns")
247247

248-
ids = changes[id_column].tolist()
249-
invalid = [i for i, v in enumerate(ids) if not isinstance(v, str) or not v.strip()]
248+
raw_ids = changes[id_column].tolist()
249+
invalid = [changes.index[i] for i, v in enumerate(raw_ids) if not isinstance(v, str) or not v.strip()]
250250
if invalid:
251251
raise ValueError(
252252
f"id_column '{id_column}' contains invalid values at row index(es) {invalid}. "
253253
"All IDs must be non-empty strings."
254254
)
255+
ids = [v.strip() for v in raw_ids]
255256

256257
change_columns = [column for column in changes.columns if column != id_column]
257258
if not change_columns:
@@ -260,10 +261,17 @@ def update(
260261
)
261262
change_list = dataframe_to_records(changes[change_columns], na_as_null=clear_nulls)
262263

263-
if len(ids) == 1:
264-
self._client.records.update(table, ids[0], change_list[0])
264+
# Filter out rows where all change values were NaN/None (empty dicts)
265+
paired = [(rid, patch) for rid, patch in zip(ids, change_list) if patch]
266+
if not paired:
267+
return
268+
ids_filtered: List[str] = [p[0] for p in paired]
269+
change_filtered: List[Dict[str, Any]] = [p[1] for p in paired]
270+
271+
if len(ids_filtered) == 1:
272+
self._client.records.update(table, ids_filtered[0], change_filtered[0])
265273
else:
266-
self._client.records.update(table, ids, change_list)
274+
self._client.records.update(table, ids_filtered, change_filtered)
267275

268276
# ----------------------------------------------------------------- delete
269277

@@ -299,15 +307,16 @@ def delete(
299307
if not isinstance(ids, pd.Series):
300308
raise TypeError("ids must be a pandas Series")
301309

302-
id_list = ids.tolist()
303-
if not id_list:
310+
raw_list = ids.tolist()
311+
if not raw_list:
304312
return None
305313

306-
invalid = [i for i, v in enumerate(id_list) if not isinstance(v, str) or not v.strip()]
314+
invalid = [ids.index[i] for i, v in enumerate(raw_list) if not isinstance(v, str) or not v.strip()]
307315
if invalid:
308316
raise ValueError(
309317
f"ids Series contains invalid values at index(es) {invalid}. " "All IDs must be non-empty strings."
310318
)
319+
id_list = [v.strip() for v in raw_list]
311320

312321
if len(id_list) == 1:
313322
self._client.records.delete(table, id_list[0])

0 commit comments

Comments
 (0)