Я работаю над созданием слоя 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 (), поэтому я заменил его именем родительского класса, но не напрасно.
Любая помощь будет оценена. Заранее спасибо.