Inspect update errors: If num_update_errors > 0, check which keys had problems
for key, errors in result["users"].update_errors.items():print(f"Row {key} had update errors: {errors}")
Inspect finalize errors: If num_finalize_errors > 0, check validation issues
for key, errors in result["users"].finalize_errors.items():print(f"Row {key} failed validation: {errors}")
Look at successful instances: Compare working rows with error rows
print(f"Successfully created {len(result['users'].instances)} instances")
Example
# Not shown: setup of root/emit/mappingfrom etielle.executor import run_mappingresults = run_mapping(root, mapping)users = results["users"]print(users.stats)print(users.update_errors)print(users.finalize_errors)
{'num_instances': 0, 'num_update_errors': 1, 'num_finalize_errors': 1}
{('u1',): ["table=users key=('u1',) field emali: unknown field; did you mean email?"]}
{('u1',): ["table=users key=('u1',) 1 validation error for User\nemail\n Field required [type=missing, input_value={'id': 'u1'}, input_type=dict]\n For further information visit https://errors.pydantic.dev/2.12/v/missing"]}
The output shows what actual error messages look like:
# Example output:result["users"].update_errors# {# ('u1',): [# "Unknown field 'emali' for table 'users'. Did you mean: 'email'?"# ]# }result["users"].finalize_errors# {# ('u1',): [# "Field 'email' is required but was not set"# ]# }
See also
Field selectors - How to avoid typos with type-safe selectors