У меня есть некоторый существующий код, который использует объекты таблицы 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 и вообще не обращаться к базе данных. Но это также непомерно дорого, потому что для всех существующих тестов нам пришлось бы выяснять, где они касаются базы данных и каковы соответствующие настройки и использование имитации. Для пары тестов это совершенно нормально, но если у вас много тестов, это требует много работы.
Вот так, спасибо! Мне не удалось найти способ обойти документацию настолько, чтобы понять, что вы можете сделать это с помощью ресурса. Если вы опубликуете это как ответ, а не комментарий, я приму это. :-)
Да, вы можете использовать классы уровня ресурсов, такие как Таблица , как с реальной службой 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)
Использовать
resource = boto3.resource('dynamodb', endpoint_url='http://localhost:8000')
, а затемtable = resource.Table(name)
?