【问题标题】:Can I get a boto3 DynamoDB table object from a client object?我可以从客户端对象获取 boto3 DynamoDB 表对象吗?
【发布时间】:2022-11-06 16:26:01
【问题描述】:

我有一些使用 boto3 (python) DynamoDB Table 对象来查询数据库的现有代码:

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)
  • 原来如此,谢谢!我没有设法在文档中找到足够的方法来意识到您可以使用资源来做到这一点。如果您将其发布为答案而不是评论,我会接受它。 :-)

标签: amazon-web-services amazon-dynamodb boto3


【解决方案1】:

是的,您可以通过DynamoDB service resourceTable 等资源级类与真正的DynamoDB 服务和DynamoDB Local 一起使用,如下所示:

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

【讨论】:

    【解决方案2】:

    ‎其他答案正确地告诉你,如果你喜欢“资源”API,即使在本地 DynamoDB 中,你仍然可以使用它(顺便说一句,不要脸的插件:如果你正在寻找可自安装版本的 DynamoDB,你也可以考虑具有 DynamoDB API 的开源 ScyllaDB 项目)。

    我只是想补充一点,如果您确实想切换到我推荐的“客户端”API(它更易于使用),仍然可以从客户端获取表对象。做就是了:

    table = db_client.Table(name)
    

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 2015-01-14
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多