GitHub
10/30/2025, 11:11 AMTarget._process_record_message initializes the target context by calling Sink._get_context, which in the BatchSink implementation sets the batch_id key to a UUID string. Target._process_batch_message should behave in a similar way.
sdk/singer_sdk/target_base.py
Lines 281 to 318 in</meltano/sdk/commit/5f9f70a99c6314d87ad91b7a2ad3ef7886483d6f|5f9f70a>
| def _process_record_message(self, message_dict: dict) -> None: |
| ------------------------------------------------------------------------ |
| """Process a RECORD message. |
| |
| Args: |
| message_dict: TODO |
| """ |
| self._assert_line_requires(message_dict, requires={"stream", "record"}) |
| |
| stream_name = message_dict["stream"] |
| for stream_map in self.mapper.stream_maps[stream_name]: |
| # new_schema = helpers._float_to_decimal(new_schema) |
| raw_record = copy.copy(message_dict["record"]) |
| transformed_record = stream_map.transform(raw_record) |
| if transformed_record is None: |
| # Record was filtered out by the map transform |
| continue |
| |
| sink = self.get_sink(stream_map.stream_alias, record=transformed_record) |
| context = sink._get_context(transformed_record) |
| if sink.include_sdc_metadata_properties: |
| sink._add_sdc_metadata_to_record( |
| transformed_record, message_dict, context |
| ) |
| else: |
| sink._remove_sdc_metadata_from_record(transformed_record) |
| |
| sink._validate_and_parse(transformed_record) |
| |
| sink.tally_record_read() |
| transformed_record = sink.preprocess_record(transformed_record, context) |
| sink.process_record(transformed_record, context) |
| sink._after_process_record(context) |
| |
| if sink.is_full: |
| self.logger.info( |
| f"Target sink for '{sink.stream_name}' is full. Draining..." |
| ) |
| self.drain_one(sink) |
### Code
No response
meltano/sdkGitHub
10/30/2025, 11:11 AM