Могу ли я получить объект таблицы boto3 DynamoDB из объекта клиента?

У меня есть некоторый существующий код, который использует объекты таблицы DynamoDB boto3 (python) для запроса базы данных:

import boto3
resource = boto3.resource("dynamodb")
table = resource.table("my_table")
# Do stuff here

Теперь мы хотим запустить тесты для этого кода с помощью DynamoDB Local вместо подключения к DynamoDB, чтобы попытаться ускорить их работу и сэкономить ресурсы. Я понимаю, что для этого мне нужно использовать клиентский объект, а не табличный объект:

import boto3
session = boto3.session.Session()
db_client = session.client(service_name = "dynamodb", endpoint_url = "http://localhost:8000")
# Do slightly different stuff here, 'cos clients and tables work differently

Однако на самом деле существует довольно много существующего кода, вплоть до того, что стоимость переписывания всего для работы с клиентами, а не с таблицами, вероятно, будет непомерно высокой.

Есть ли способ либо получить объект таблицы, указав endpoint_url, чтобы я мог указать его на DynamoDB Local при создании, либо получить объект таблицы boto3 dynamodb из клиентского объекта boto3 dynamodb?

PS: я знаю, что мог бы также имитировать вызовы boto3 и вообще не обращаться к базе данных. Но это также непомерно дорого, потому что для всех существующих тестов нам пришлось бы выяснять, где они касаются базы данных и каковы соответствующие настройки и использование имитации. Для пары тестов это совершенно нормально, но если у вас много тестов, это требует много работы.

Использовать resource = boto3.resource('dynamodb', endpoint_url='http://localhost:8000'), а затем table = resource.Table(name)?

jarmod 04.11.2022 18:19

Вот так, спасибо! Мне не удалось найти способ обойти документацию настолько, чтобы понять, что вы можете сделать это с помощью ресурса. Если вы опубликуете это как ответ, а не комментарий, я приму это. :-)

Ben Taylor 04.11.2022 18:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
120
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, вы можете использовать классы уровня ресурсов, такие как Таблица , как с реальной службой DynamoDB, так и с DynamoDB Local через ресурс службы DynamoDB, следующим образом:

resource = boto3.resource('dynamodb', endpoint_url='http://localhost:8000')
table = resource.Table(name)

‎В других ответах правильно сказано, что если вам понравился «ресурсный» API, вы все равно можете использовать его даже с локальной DynamoDB (кстати, бессовестный плагин: если вы ищете самоустанавливающуюся версию DynamoDB, вы также можете рассмотрим проект ScyllaDB с открытым исходным кодом, который имеет API DynamoDB).

Я просто хотел добавить, что если вы хотите переключиться на «клиентский» API, который я рекомендую (он проще в использовании), по-прежнему можно получить объект таблицы от клиента. Просто делать:

table = db_client.Table(name)

Другие вопросы по теме