async def METHOD_NAME(self, record: Record):
    # Column name of value mapping
    bindings = {self.parent.config.key: record.key}
    # Features
    features = record.features(self.parent.config.features.keys())
    for feature_name, column_name in self.parent.config.features.items():
        bindings[column_name] = features.get(feature_name, None)
    # Predictions
    predictions = record.predictions(self.parent.config.predictions.keys())
    for (
        feature_name,
        (value_column_name, confidence_column_name),
    ) in self.parent.config.predictions.items():
        bindings[value_column_name] = None
        if confidence_column_name is not None:
            bindings[confidence_column_name] = None
        if feature_name in predictions:
            bindings[value_column_name] = predictions[feature_name][
                "value"
            ]
            if confidence_column_name is not None:
                bindings[confidence_column_name] = predictions[
                    feature_name
                ]["confidence"]
    # Bindings should be the values for each column, where the value for the
    # key is not repeated for the UPDATE. If using REPLACE INTO, don't
    # repeat values
    values = list(bindings.values())
    if not "REPLACE" in self.parent.config.METHOD_NAME.upper():
        values += list(bindings.values())[1:]
    # Execute the update query
    await self.conn.execute(self.parent.config.METHOD_NAME, values)
    self.logger.debug("Updated: %s: %r", record.key, bindings)