55
66from __future__ import annotations
77
8- from typing import List , Optional , TYPE_CHECKING
8+ from typing import Any , Dict , List , Optional , TYPE_CHECKING
99
1010import 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