def save(self, messages: List[Message]):
        """
        Save the messages to the data store. The messages must all be of the same message type.

        :param List[Message] messages: a list of Message objects
        :return: None
        """
        if messages:
            statement = Message.insert_statement()
            try:
                with self.connection as conn:
                    with conn.cursor() as cursor:

                        all_messages = [{
                            **vars(message)
                        } for message in messages]

                        try:
                            logger.info(
                                f"Inserting {len(all_messages)} messages. "
                                f"(from: {all_messages[0]['device_timestamp'].isoformat()} "
                                f"to: {all_messages[-1]['device_timestamp'].isoformat()})"
                            )
                            logger.debug(pformat(all_messages))
                            execute_batch(cursor, statement, all_messages)
                        except Exception as e:
                            logger.warning(
                                "Unable to insert row, checking to ensure table exists."
                            )
                            if not self.table_exists():
                                self.create_table()
                                execute_batch(cursor, statement, all_messages)
            except Exception as e:
                raise StorageError(
                    f"Unable to store messages [{messages}]") from e