DynamoDB table.get_item () выполняется дважды - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над созданием слоя DAO для нескольких таблиц. Поскольку существует множество методов, которые будут использоваться в разных DAO, я подумал об использовании родительского класса для всех из них и реализации нескольких общих методов. Я передаю атрибуты table_name и __name__ родительскому классу, чтобы он создавал регистратор дочернего класса и создавал правильную переменную таблицы.

Ниже показано, как я это делаю.

class Parent(object):    
    def __init__(self, class_name, table_name):
        ddb = boto3.resource("dynamodb", region_name=constants.AWS_REGION)
        self.table_name = table_name
        self.table = ddb.Table(table_name)
        self.logger = logging.getLogger(class_name)

    def get_record(self, **kwargs):
        try :
            self.logger.info(f"self type => {type(self)}")
            record = self.table.get_item(**kwargs)
            self.logger.info(f"record => {record}")
            record = record['Item']
            if record == {}:
                raise NoRecordException(f"No record with {kwargs} found in {self.table_name}")
        except botocore.exceptions.ClientError as e:
            raise e
        return record



class Child(Parent):

    def __init__(self, *args, **kwargs):
        super().__init__(self, class_name=__name__, table_name="Child")
        self.record = {}

    def get_child_record(self, id):
        return self.get_record(Key={"id": id})

Когда я звоню Child().get_child_record(id), я вижу, что self.table.get_item выполняется дважды. Мало того, второй раз он запускается с самим record вместо аргументов, с которыми я вызвал функцию, и в результате получает ошибку ниже.

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the GetItem operation: The provided key element does not match the schema 

Я не могу понять, что может запускать этот. Я подумал, что это может быть из-за super (), поэтому я заменил его именем родительского класса, но не напрасно.

Любая помощь будет оценена. Заранее спасибо.

1 Ответ

0 голосов
/ 18 июня 2020

Я ошибся по номеру get_record(), из-за чего я подумал, что что-то повторяется. Удалось идентифицировать его при тестировании путем вызова метода с использованием как дочернего, так и родительского объекта.

...