我正在尝试使用DynamoDB javascript shell创建一个简单的表,我得到了这个异常:
{
"message": "The number of attributes in key schema must match the number of attributes defined in attribute definitions.",
"code": "ValidationException",
"time": "2015-06-16T10:24:23.319Z",
"statusCode": 400,
"retryable": false
}
下面是我要创建的表:
var params = {
TableName: 'table_name',
KeySchema: [
{
AttributeName: 'hash_key_attribute_name',
KeyType: 'HASH',
},
],
AttributeDefinitions: [
{
AttributeName: 'hash_key_attribute_name',
AttributeType: 'S',
},
{
AttributeName: 'attribute_name_1',
AttributeType: 'S',
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1,
},
};
dynamodb.createTable(params, function(err, data) {
if (err) print(err);
else print(data);
}); …
Run Code Online (Sandbox Code Playgroud) 尽管亚马逊提供了有关如何使用Java,PHP和.Net 连接到本地dynamoDB的文档,但没有描述如何使用Python连接到localhost:8000.Web上的现有文档指向在boto.dynamodb2.layer1中使用DynamoDBConnection方法,但这会在使用boto3协议管理dynamoDB的实时环境和测试环境之间创建不兼容性.
在boto3中,您可以使用以下构造函数和设置到环境中的变量向dynamo发出请求:
client = boto3.client('dynamodb')
table = client.list_tables()
Run Code Online (Sandbox Code Playgroud)
而boto.dynamodb2.layer1包需要您构造以下内容:
client = DynamoDBConnection(
host='localhost',
port=8000,
aws_access_key_id='anything',
aws_secret_access_key='anything',
is_secure=False)
table = client.list_tables()
Run Code Online (Sandbox Code Playgroud)
尽管可以创建基于本地环境确定正确构造函数的逻辑,但我对构建一组将每个构造函数视为相同的方法持谨慎态度.相反,我更喜欢使用boto3来处理所有事情,并且能够在环境变量中设置dynamoDB的端点.不幸的是,该选项似乎目前无法使用.
有没有办法使用boto3来定义dynamoDB本地端点(就像其他语言一样)?或亚马逊计划支持此功能的任何机会?
注意:所有这些都发生在DynamoDB的本地实例上.
这是我用来从DynamoDB Shell创建表的代码:
var params = {
TableName: "TABLE-NAME",
KeySchema: [
{ AttributeName: "pid",
KeyType: "HASH"
}
],
AttributeDefinitions: [
{ AttributeName: "pid",
AttributeType: "S"
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1
}
};
dynamodb.createTable(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
Run Code Online (Sandbox Code Playgroud)
这是被调用以将元素添加到DB中的函数(在node.js中):
function(request, response) {
params = {
TableName: 'TABLE-NAME',
Item: {
pid: 'abc123'
}
};
console.log(params);
dynamodb.putItem(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
} …
Run Code Online (Sandbox Code Playgroud) 我有一个本地dynamo-db运行.我已经使用JavaScript控制台设置了表格,并且从那里列出了OK.
我还可以从JavaScript控制台向我的表中放置和获取项目:
var params = { TableName:"environmentId", Item: { environmentId: {"S":"a4fe1736-98cf-4560-bcf4-cc927730dd1b"} }};
dynamodb.putItem(params, function(err, data) {
console.log("put : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
});
Run Code Online (Sandbox Code Playgroud)
打印put : err was null and data is {}
我认为是"成功"因为
params = { "Key":{"environmentId":{"S":"a4fe1736-98cf-45e0-bcf4-cc927730dd1b"}},"TableName":"environmentId"}
dynamodb.getItem(params, function(err, data) {
console.log("get : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
});
Run Code Online (Sandbox Code Playgroud)
打印,get : err was null and data is {"Item":{"environmentId":{"S":"a4fe1736-98cf-45e0-bcf4-cc927730dd1b"}}}
即它检索我刚刚放到桌子上的对象.
但是,如果它启动节点REPL并键入:
var …
Run Code Online (Sandbox Code Playgroud) 我必须测试一个严重依赖Amazon的DynamoDB的应用程序.我希望测试能够单独运行,这就是我选择DynamoDB Local的原因.jar
.我知道最近的更新,使我们能够在没有外部bash命令调用的情况下运行它.但是,当我尝试运行此处指定的示例时,我得到以下stacktrace:
Exception in thread "main" com.amazonaws.AmazonServiceException: The request processing has failed because of an unknown error, exception or failure. (Service: AmazonDynamoDBv2; Status Code: 500; Error Code: InternalFailure; Request ID: cab7a550-aaa6-4bfe-a591-0b255481cc14)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1275)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:873)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:576)
at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:362)
at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:328)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:307)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:1805)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.listTables(AmazonDynamoDBClient.java:1223)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.listTables(AmazonDynamoDBClient.java:1235)
Run Code Online (Sandbox Code Playgroud)
这是我试图运行的代码:
public static void main( String[] args ) throws Exception
{
AmazonDynamoDB dynamodb = null;
DynamoDBProxyServer server = null;
final String[] localArgs = { "-inMemory", "-port", "13005" …
Run Code Online (Sandbox Code Playgroud) 我似乎无法在Dynamo db local中获得流支持,是否支持?我能找到它的唯一标志是http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html#Tools.DynamoDBLocal.Differences中的最后一个要点.
使用dynamodb local,似乎忽略了StreamSpecification,因此在调用createTable或describeTable时没有LatestStreamArn
以下代码使用托管的dynamodb服务返回LatestStreamArn,但不返回dynamodb local:
ddb.createTable({
TableName: 'streaming_test',
AttributeDefinitions: [
{ AttributeName: 'id', AttributeType: 'S' }
],
KeySchema: [
{ AttributeName: 'id', KeyType: 'HASH' }
],
ProvisionedThroughput: {
ReadCapacityUnits: 5,
WriteCapacityUnits: 5
},
StreamSpecification: {
StreamEnabled: true,
StreamViewType: 'NEW_AND_OLD_IMAGES'
}
}, function (err, data) {
if (err) {
console.log(err, err.stack)
} else {
// data.TableDescription.StreamSpecification and
// data.TableDescription.LatestStreamArn are undefined
// for dynamodb local
console.log(data)
}
})
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行dynamodb local进行测试.我按照亚马逊提供的步骤设置它并运行jar本身工作正常(链接到亚马逊的教程这里).但是,本教程不会在您自己的项目中运行jar.我不希望所有其他开发人员每次测试代码时都必须抓住jar并在本地运行它.
这就是我的问题所在.我在网上找到了如何配置gradle项目以运行dynamodb本地服务器作为我的测试的一部分.我找到了以下maven示例https://github.com/awslabs/aws-dynamodb-examples/blob/master/src/test/java/com/amazonaws/services/dynamodbv2/DynamoDBLocalFixture.java#L32我正在尝试转换它是一个gradle,但是com.amazonaws.services.dynamodbv2.local
他们正在使用的所有import语句都会出错.错误是无法找到资源.
我进入他们项目的pom并将以下内容放入我的gradle.build文件中以模拟它.
Run Code Online (Sandbox Code Playgroud)//dynamodb local dependencies testCompile('com.amazonaws:aws-java-sdk-dynamodb:1.10.42') testCompile('com.amazonaws:aws-java-sdk-cloudwatch:1.10.42') testCompile('com.amazonaws:aws-java-sdk:1.3.0') testCompile('com.amazonaws:amazon-kinesis-client:1.6.1') testCompile('com.amazonaws:amazon-kinesis-connectors:1.1.1') testCompile('com.amazonaws:dynamodb-streams-kinesis-adapter:1.0.2') testCompile('com.amazonaws:DynamoDBLocal:1.10.5.1')
导入语句仍然失败.这是一个失败的例子.
import com.amazonaws.services.dynamodbv2.local.embedded.DynamoDBEmbedded;
Run Code Online (Sandbox Code Playgroud)
TL; DR
有没有人设法让dynamodb本地jar作为gradle项目的一部分执行,或者有一个很好的教程的链接(它不一定是我链接到的教程).
我使用 AWS NoSQL Workbench 查看我的 DynamoDBLocal 表。
我可以连接到我的 DynamoDBLocal 并列出我拥有的表的名称,但是当我想查看任何表的内容时,我会得到以下堆栈跟踪:
2022-08-11T08:22:12.749 ERROR --- [ asgi_gw_2] l.aws.handlers.logging : exception during call chain
Traceback (most recent call last):
File "/opt/code/localstack/localstack/aws/chain.py", line 57, in handle
handler(self, self.context, response)
File "/opt/code/localstack/localstack/aws/handlers/service.py", line 121, in __call__
handler(chain, context, response)
File "/opt/code/localstack/localstack/aws/handlers/legacy.py", line 81, in __call__
result = self.forward_request(
File "/opt/code/localstack/localstack/aws/handlers/legacy.py", line 141, in forward_request
return do_forward_request(
File "/opt/code/localstack/localstack/services/edge.py", line 225, in do_forward_request
result = do_forward_request_inmem(api, method, path, data, headers, port=port)
File "/opt/code/localstack/localstack/services/edge.py", line 249, in …
Run Code Online (Sandbox Code Playgroud) 有人可以告诉我一个有效的关键条件表达式.我试图在一个名为MyKeyTable的简单表上运行查询.它有两个"列",即Id和AnotherNumberThatICareAbout,类型为Long.
我想看看我投入的所有价值观.所以我尝试过:
aws dynamodb query --select ALL_ATTRIBUTES --table-name MyKeyTable
--endpoint http://localhost:8000
--key-condition-expression "WHAT DO I PUT IN HERE?"
Run Code Online (Sandbox Code Playgroud)
我需要放入什么哈希?文档对这个imho有点蹩脚.任何帮助表示感谢,即使它只是一个好文档的链接.
我使用泊坞窗启用dynamoDB地方提到这里
以下是我的 JS 代码:
AWS.config.update({
region: 'sas',
endpoint: 'http://docker.for.mac.host.internal:8000' //'http://localhost:8000'
});
Run Code Online (Sandbox Code Playgroud)
并在下面创建表函数:
function createTable() {
let params = {
TableName: 'sas',
KeySchema: [{
AttributeName: 'title',
KeyType: 'HASH',
}],
AttributeDefinitions: [{
AttributeName: 'title',
AttributeType: 'S'
}],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1,
}
};
dynamoDB.createTable(params, function(err, data) {
if (err)
console.log(err); // an error occurred
else
console.log(data);
});
}
Run Code Online (Sandbox Code Playgroud)
我可以看到使用 cli创建的表sas:
aws dynamodb list-tables --endpoint-url http://localhost:8000 --region=sas
Run Code Online (Sandbox Code Playgroud)
但没有在 中列出表格,它总是空的。
http://localhost:8000/shell/
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
注意:通过在本地运行 dynamodb jar,我可以使用上面的代码查看我的表格
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar …
Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js amazon-dynamodb docker dynamo-local