gpt4 book ai didi

python-3.x - 名称 'Key' 未定义用于访问 DynamoDB 的 Lambda 函数

转载 作者:行者123 更新时间:2023-12-04 16:42:10 29 4
gpt4 key购买 nike

我在 Python 中使用 boto3 库中的查询函数并收到以下错误:

name 'Key' is not defined: NameError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 51, in lambda_handler
if not getAssetExistance(slack_userID):
File "/var/task/lambda_function.py", line 23, in getAssetExistance
response = dynamoTable.query(KeyConditionExpression=Key('userID').eq(asset))
NameError: name 'Key' is not defined

我一直在阅读一堆关于通过 Lambda 访问 DynamoDB 的教程,当尝试是否存在键时,它们都使用此 KeyConditionExpression 行。

下面是相关代码(第23行是查询行):
def getAssetExistance(asset):
dynamoTable = dynamo.Table('Assets')
response = dynamoTable.query(KeyConditionExpression=Key('userID').eq(asset))

return bool(response)

我基本上想检查我的 DynamoDB 表(这是一个松弛的用户 ID)中的主分区键,看看是否存在。

如果相关,这是代码的其余部分:
################################
# Slack Lambda handler.
################################

import boto3
import logging
import os
import urllib

# Grab data from the environment.
BOT_TOKEN = os.environ["BOT_TOKEN"]
ASSET_TABLE = os.environ["ASSET_TABLE"]
REGION_NAME = os.getenv('REGION_NAME', 'us-east-1')

dynamo = boto3.resource('dynamodb', region_name=REGION_NAME, endpoint_url="https://dynamodb.us-east-1.amazonaws.com")

# Define the URL of the targeted Slack API resource.
SLACK_URL = "https://slack.com/api/chat.postMessage"

def getAssetExistance(asset):
dynamoTable = dynamo.Table('Assets')
response = dynamoTable.query(KeyConditionExpression=Key('userID').eq(asset))

return bool(response)

def lambda_handler(data, context):
# Slack challenge answer.
if "challenge" in data:
return data["challenge"]

# Grab the Slack channel data.
slack_event = data['event']
slack_userID = slack_event["user"]
slack_text = slack_event["text"]
channel_id = slack_event["channel"]
slack_reply = ""

# Ignore bot messages.
if "bot_id" in slack_event:
slack_reply = ""
else:

# Start data sift.
if slack_text.startswith("!networth"):
slack_reply = "Your networth is: "
elif slack_text.startswith("!price"):
command,asset = text.split()
slack_reply = "The price of a(n) %s is: " % (asset)
elif slack_text.startswith("!addme"):
if not getAssetExistance(slack_userID):
slack_reply = "Adding user: %s" % (slack_userID)
dynamo.update_item(TableName=ASSET_TABLE,
Key={'userID':{'S':'slack_userID'}},
AttributeUpdates= {
'resources':{
'Action': 'ADD',
'Value': {'N': '1000'}
}
}
)
else:
slack_reply = "User %s already exists" % (slack_userID)

# We need to send back three pieces of information:
data = urllib.parse.urlencode(
(
("token", BOT_TOKEN),
("channel", channel_id),
("text", slack_reply)
)
)
data = data.encode("ascii")

# Construct the HTTP request that will be sent to the Slack API.
request = urllib.request.Request(
SLACK_URL,
data=data,
method="POST"
)
# Add a header mentioning that the text is URL-encoded.
request.add_header(
"Content-Type",
"application/x-www-form-urlencoded"
)

# Fire off the request!
urllib.request.urlopen(request).read()

# Everything went fine.
return "200 OK"

我的 DynamoDB 表名为“Assets”,有一个名为“userID”(字符串)的主分区键。

我绝对对这一切还是陌生的,所以不要害怕称我为傻瓜。任何和所有的帮助表示赞赏。此代码的目的是检查用户是否作为键存在于 DynamoDB 中,如果不存在,则将它们添加到表中。

最佳答案

您需要导入 Key函数,像这样:

from boto3.dynamodb.conditions import Key

关于python-3.x - 名称 'Key' 未定义用于访问 DynamoDB 的 Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49407958/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com