如何在 python 中为 aws dynamodb 创建内容对象?

How to create constent object for aws dynamodb in python?

我想知道如何检查 boto3 客户端对象是否已经实例化。我有以下用于为 aws dynamodb

创建对象的代码
import boto3
def aws_dynamodb():
   return boto3.resource("dynamodb")


def get_db_con():
    dynamo_conn=aws_dynamodb()
    return dynamo_conn       

现在上面'get_db_con()' return连接到dynamodb。但我想确保 'get_db_con' 不会在每次被调用时从 'aws_dynamodb()' 创建客户端对象。

例如:


def aws_db_table(table):
   con=get_db_con()
   return con.table(table)

account_table=aws_db_table("my_ac_table")
audit_table=aws_db_table("audit_table")

所以每当我调用 'aws_db_table' 时,它不应该每次都为 'aws_dynamodb()' 创建客户端。

所以如果 aws_dynamodb() 已经实例化或没有创建新的客户端对象,我如何检查它。因为每次创建客户端对象的成本很高..

注意:我想运行 Lambda 函数中的代码

请在这方面帮助我们..

谢谢

我通常会使用一个看起来像这样的全局变量的低技术解决方案:

import boto3

# Underscore-prefix to indicate this is something private
_TABLE_RESOURCE = None

def get_table_resource():
    global _TABLE_RESOURCE
    if _TABLE_RESOURCE is None:
        _TABLE_RESOURCE = boto3.resource("dynamodb").Table("my_table")
    return _TABLE_RESOURCE

def handler(event, context):
    table = get_table_resource()
    # ...

全局变量在 Lambda 执行过程中保持不变,这就是它起作用的原因。

另一种选择是使用 functools 中的 lru_cache,它使用记忆。

from functools import lru_cache
import boto3

@lru_cache(maxsize=128)
def get_table_resource():
    return boto3.resource("dynamodb").Table("my_table")

def handler(event, context):
    table = get_table_resource()
    # ...

对于那些不熟悉记忆的人来说,第一个解决方案可能更容易阅读和理解。 (注:代码是凭记忆写的,可能有bug)