如何使用Python和AWS Lambda将项目放入AWS DynamoDB?

72

在AWS Lambda中使用Python,我该如何在DynamoDB表中放置/获取一个项目?

在Node.js中,这将类似于:

dynamodb.getItem({
    "Key": {"fruitName" : 'banana'},
    "TableName": "fruitSalad"
}, function(err, data) {
    if (err) {
        context.fail('Incorrect username or password');
    } else {
        context.succeed('yay it works');
    }
});

我所需要的就是Python等价代码。


虽然来晚了,但我已经编写了一个类似的 DynamoDB 基本操作代码,涵盖了您的问题:https://github.com/hardikvasa/database-journal/blob/master/code-samples/dynamodb.py - hnvasa
@hnvasa:这个问题涉及使用AWS Lambda。 - ashdnik
这个视频可能会有所帮助 https://www.youtube.com/watch?v=neDCz0YsEj4 - Shams
4个回答

104

使用 Boto3(Python 的最新 AWS SDK)

您可以通过以下方式导入:

import boto3

然后通过调用客户端

dynamodb = boto3.client('dynamodb')

获取项目示例

dynamodb.get_item(TableName='fruitSalad', Key={'fruitName':{'S':'Banana'}})

放置物品示例

dynamodb.put_item(TableName='fruitSalad', Item={'fruitName':{'S':'Banana'},'key2':{'N':'value2'}})

'S'表示字符串类型,'N'表示数值类型

有关其他数据类型,请参阅http://boto3.readthedocs.org/en/latest/reference/services/dynamodb.html#DynamoDB.Client.put_item


32
有什么想法可以将在Python中使用的实际字典转换为亚马逊疯狂的结构吗? - ryantuck
25
如果使用资源和表格,则不需要使用RyanTuck,您可以使用您的dict。dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(TableName) table.put_item({"fruitName" : '香蕉'}) - Leticia Santos
4
Ryan Tuck的问题非常合理。当您需要使用attribute_not_exists ConditionExpression时,只能使用客户端而不是资源。因此,在使用客户端时,您必须处理boto3低级客户端的愚蠢格式。 - doanduyhai
请记住,如果您创建了一个带有关联的次要键的主键,则需要查询两个键。 - Nicolò Gasparini
我对于何时告诉boto3参数的类型感到困惑,毕竟它是Python。我看过一些似乎不需要指定参数类型的示例,但并不确定是否可行。 - Samantha Atkins
一个或多个参数值无效:键xyz的类型不匹配,期望为S,实际为M。 - Jeremy Thompson

49

使用最新的AWS SDK

import boto3

def lambda_handler(event, context):
    # this will create dynamodb resource object and
    # here dynamodb is resource name
    client = boto3.resource('dynamodb')

    # this will search for dynamoDB table 
    # your table name may be different
    table = client.Table("dynamoDB")
    print(table.table_status)

    table.put_item(Item= {'id': '34','company':  'microsoft'})

如果您正在使用AWS,则可以使用此代码示例,只需为此Lambda函数授予权限即可。您可以在链接中找到详细信息。


1
这是一个恰当的答案,因为我在使用boto3.client时遇到了问题。此外,客户端需要进行额外的格式化! - satish silveri
我正在本地主机上使用Docker运行Dynamo,成功创建表格后,print(table.table_status)语句返回了botocore.errorfactory.ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the DescribeTable operation: Cannot do operations on a non-existent table异常信息。 - med

21

完整示例:

import boto3

def lambda_handler(event, context):

    client = boto3.client('dynamodb')

    for record in event['Records']:
        # your logic here...
        try:
            client.update_item(TableName='dynamo_table_name', Key={'hash_key':{'N':'value'}}, AttributeUpdates={"some_key":{"Action":"PUT","Value":{"N":'value'}}}) 
        except Exception, e:
            print (e)

请注意,您需要决定何时使用“update_item”或“put_item”。
使用“update_item”,可以确保只有一个具有相同哈希/范围的记录。如果记录存在,则可以更新此记录,否则将创建它。

http://boto3.readthedocs.org/en/latest/reference/services/dynamodb.html#DynamoDB.Client.update_item


我没有看到原始内容与lambda有任何关系。 - Samantha Atkins

6

您可以使用以下代码来写入和读取 DynamoDB 表:

首先,导入 boto3 包。

import boto3

创建一个 DynamoDB 的对象。
dynamodb = boto3.resource('dynamodb')

选择您要操作的特定表格。
table = dynamodb.Table("fruitSalad")

编写:

table.put_item(Item= {'fruitName': 'Banana'})

阅读:

table.get_item(Key={'fruitName': 'Banana'})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接