Creating Example Tables and Uploading Data Using the AWS SDK for .NET - Amazon DynamoDB

Creating Example Tables and Uploading Data Using the AWS SDK for .NET

The following C# code example creates tables and uploads data to the tables. The resulting table structure and data is shown in Creating Tables and Loading Data for Code Examples in DynamoDB. For step-by-step instructions to run this code in Visual Studio, see .NET Code Examples.

/** * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * This file is licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ using System; using System.Collections.Generic; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DocumentModel; using Amazon.DynamoDBv2.Model; using Amazon.Runtime; using Amazon.SecurityToken; namespace com.amazonaws.codesamples { class CreateTablesLoadData { private static AmazonDynamoDBClient client = new AmazonDynamoDBClient(); static void Main(string[] args) { try { //DeleteAllTables(client); DeleteTable("ProductCatalog"); DeleteTable("Forum"); DeleteTable("Thread"); DeleteTable("Reply"); // Create tables (using the AWS SDK for .NET low-level API). CreateTableProductCatalog(); CreateTableForum(); CreateTableThread(); // ForumTitle, Subject */ CreateTableReply(); // Load data (using the .NET SDK document API) LoadSampleProducts(); LoadSampleForums(); LoadSampleThreads(); LoadSampleReplies(); Console.WriteLine("Sample complete!"); Console.WriteLine("Press ENTER to continue"); Console.ReadLine(); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } } private static void DeleteTable(string tableName) { try { var deleteTableResponse = client.DeleteTable(new DeleteTableRequest() { TableName = tableName }); WaitTillTableDeleted(client, tableName, deleteTableResponse); } catch (ResourceNotFoundException) { // There is no such table. } } private static void CreateTableProductCatalog() { string tableName = "ProductCatalog"; var response = client.CreateTable(new CreateTableRequest { TableName = tableName, AttributeDefinitions = new List<AttributeDefinition>() { new AttributeDefinition { AttributeName = "Id", AttributeType = "N" } }, KeySchema = new List<KeySchemaElement>() { new KeySchemaElement { AttributeName = "Id", KeyType = "HASH" } }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 10, WriteCapacityUnits = 5 } }); WaitTillTableCreated(client, tableName, response); } private static void CreateTableForum() { string tableName = "Forum"; var response = client.CreateTable(new CreateTableRequest { TableName = tableName, AttributeDefinitions = new List<AttributeDefinition>() { new AttributeDefinition { AttributeName = "Name", AttributeType = "S" } }, KeySchema = new List<KeySchemaElement>() { new KeySchemaElement { AttributeName = "Name", // forum Title KeyType = "HASH" } }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 10, WriteCapacityUnits = 5 } }); WaitTillTableCreated(client, tableName, response); } private static void CreateTableThread() { string tableName = "Thread"; var response = client.CreateTable(new CreateTableRequest { TableName = tableName, AttributeDefinitions = new List<AttributeDefinition>() { new AttributeDefinition { AttributeName = "ForumName", // Hash attribute AttributeType = "S" }, new AttributeDefinition { AttributeName = "Subject", AttributeType = "S" } }, KeySchema = new List<KeySchemaElement>() { new KeySchemaElement { AttributeName = "ForumName", // Hash attribute KeyType = "HASH" }, new KeySchemaElement { AttributeName = "Subject", // Range attribute KeyType = "RANGE" } }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 10, WriteCapacityUnits = 5 } }); WaitTillTableCreated(client, tableName, response); } private static void CreateTableReply() { string tableName = "Reply"; var response = client.CreateTable(new CreateTableRequest { TableName = tableName, AttributeDefinitions = new List<AttributeDefinition>() { new AttributeDefinition { AttributeName = "Id", AttributeType = "S" }, new AttributeDefinition { AttributeName = "ReplyDateTime", AttributeType = "S" }, new AttributeDefinition { AttributeName = "PostedBy", AttributeType = "S" } }, KeySchema = new List<KeySchemaElement>() { new KeySchemaElement() { AttributeName = "Id", KeyType = "HASH" }, new KeySchemaElement() { AttributeName = "ReplyDateTime", KeyType = "RANGE" } }, LocalSecondaryIndexes = new List<LocalSecondaryIndex>() { new LocalSecondaryIndex() { IndexName = "PostedBy_index", KeySchema = new List<KeySchemaElement>() { new KeySchemaElement() { AttributeName = "Id", KeyType = "HASH" }, new KeySchemaElement() { AttributeName = "PostedBy", KeyType = "RANGE" } }, Projection = new Projection() { ProjectionType = ProjectionType.KEYS_ONLY } } }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 10, WriteCapacityUnits = 5 } }); WaitTillTableCreated(client, tableName, response); } private static void WaitTillTableCreated(AmazonDynamoDBClient client, string tableName, CreateTableResponse response) { var tableDescription = response.TableDescription; string status = tableDescription.TableStatus; Console.WriteLine(tableName + " - " + status); // Let us wait until table is created. Call DescribeTable. while (status != "ACTIVE") { System.Threading.Thread.Sleep(5000); // Wait 5 seconds. try { var res = client.DescribeTable(new DescribeTableRequest { TableName = tableName }); Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName, res.Table.TableStatus); status = res.Table.TableStatus; } // Try-catch to handle potential eventual-consistency issue. catch (ResourceNotFoundException) { } } } private static void WaitTillTableDeleted(AmazonDynamoDBClient client, string tableName, DeleteTableResponse response) { var tableDescription = response.TableDescription; string status = tableDescription.TableStatus; Console.WriteLine(tableName + " - " + status); // Let us wait until table is created. Call DescribeTable try { while (status == "DELETING") { System.Threading.Thread.Sleep(5000); // wait 5 seconds var res = client.DescribeTable(new DescribeTableRequest { TableName = tableName }); Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName, res.Table.TableStatus); status = res.Table.TableStatus; } } catch (ResourceNotFoundException) { // Table deleted. } } private static void LoadSampleProducts() { Table productCatalogTable = Table.LoadTable(client, "ProductCatalog"); // ********** Add Books ********************* var book1 = new Document(); book1["Id"] = 101; book1["Title"] = "Book 101 Title"; book1["ISBN"] = "111-1111111111"; book1["Authors"] = new List<string> { "Author 1" }; book1["Price"] = -2; // *** Intentional value. Later used to illustrate scan. book1["Dimensions"] = "8.5 x 11.0 x 0.5"; book1["PageCount"] = 500; book1["InPublication"] = true; book1["ProductCategory"] = "Book"; productCatalogTable.PutItem(book1); var book2 = new Document(); book2["Id"] = 102; book2["Title"] = "Book 102 Title"; book2["ISBN"] = "222-2222222222"; book2["Authors"] = new List<string> { "Author 1", "Author 2" }; ; book2["Price"] = 20; book2["Dimensions"] = "8.5 x 11.0 x 0.8"; book2["PageCount"] = 600; book2["InPublication"] = true; book2["ProductCategory"] = "Book"; productCatalogTable.PutItem(book2); var book3 = new Document(); book3["Id"] = 103; book3["Title"] = "Book 103 Title"; book3["ISBN"] = "333-3333333333"; book3["Authors"] = new List<string> { "Author 1", "Author2", "Author 3" }; ; book3["Price"] = 2000; book3["Dimensions"] = "8.5 x 11.0 x 1.5"; book3["PageCount"] = 700; book3["InPublication"] = false; book3["ProductCategory"] = "Book"; productCatalogTable.PutItem(book3); // ************ Add bikes. ******************* var bicycle1 = new Document(); bicycle1["Id"] = 201; bicycle1["Title"] = "18-Bike 201"; // size, followed by some title. bicycle1["Description"] = "201 description"; bicycle1["BicycleType"] = "Road"; bicycle1["Brand"] = "Brand-Company A"; // Trek, Specialized. bicycle1["Price"] = 100; bicycle1["Color"] = new List<string> { "Red", "Black" }; bicycle1["ProductCategory"] = "Bike"; productCatalogTable.PutItem(bicycle1); var bicycle2 = new Document(); bicycle2["Id"] = 202; bicycle2["Title"] = "21-Bike 202Brand-Company A"; bicycle2["Description"] = "202 description"; bicycle2["BicycleType"] = "Road"; bicycle2["Brand"] = ""; bicycle2["Price"] = 200; bicycle2["Color"] = new List<string> { "Green", "Black" }; bicycle2["ProductCategory"] = "Bicycle"; productCatalogTable.PutItem(bicycle2); var bicycle3 = new Document(); bicycle3["Id"] = 203; bicycle3["Title"] = "19-Bike 203"; bicycle3["Description"] = "203 description"; bicycle3["BicycleType"] = "Road"; bicycle3["Brand"] = "Brand-Company B"; bicycle3["Price"] = 300; bicycle3["Color"] = new List<string> { "Red", "Green", "Black" }; bicycle3["ProductCategory"] = "Bike"; productCatalogTable.PutItem(bicycle3); var bicycle4 = new Document(); bicycle4["Id"] = 204; bicycle4["Title"] = "18-Bike 204"; bicycle4["Description"] = "204 description"; bicycle4["BicycleType"] = "Mountain"; bicycle4["Brand"] = "Brand-Company B"; bicycle4["Price"] = 400; bicycle4["Color"] = new List<string> { "Red" }; bicycle4["ProductCategory"] = "Bike"; productCatalogTable.PutItem(bicycle4); var bicycle5 = new Document(); bicycle5["Id"] = 205; bicycle5["Title"] = "20-Title 205"; bicycle4["Description"] = "205 description"; bicycle5["BicycleType"] = "Hybrid"; bicycle5["Brand"] = "Brand-Company C"; bicycle5["Price"] = 500; bicycle5["Color"] = new List<string> { "Red", "Black" }; bicycle5["ProductCategory"] = "Bike"; productCatalogTable.PutItem(bicycle5); } private static void LoadSampleForums() { Table forumTable = Table.LoadTable(client, "Forum"); var forum1 = new Document(); forum1["Name"] = "Amazon DynamoDB"; // PK forum1["Category"] = "Amazon Web Services"; forum1["Threads"] = 2; forum1["Messages"] = 4; forum1["Views"] = 1000; forumTable.PutItem(forum1); var forum2 = new Document(); forum2["Name"] = "Amazon S3"; // PK forum2["Category"] = "Amazon Web Services"; forum2["Threads"] = 1; forumTable.PutItem(forum2); } private static void LoadSampleThreads() { Table threadTable = Table.LoadTable(client, "Thread"); // Thread 1. var thread1 = new Document(); thread1["ForumName"] = "Amazon DynamoDB"; // Hash attribute. thread1["Subject"] = "DynamoDB Thread 1"; // Range attribute. thread1["Message"] = "DynamoDB thread 1 message text"; thread1["LastPostedBy"] = "User A"; thread1["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); thread1["Views"] = 0; thread1["Replies"] = 0; thread1["Answered"] = false; thread1["Tags"] = new List<string> { "index", "primarykey", "table" }; threadTable.PutItem(thread1); // Thread 2. var thread2 = new Document(); thread2["ForumName"] = "Amazon DynamoDB"; // Hash attribute. thread2["Subject"] = "DynamoDB Thread 2"; // Range attribute. thread2["Message"] = "DynamoDB thread 2 message text"; thread2["LastPostedBy"] = "User A"; thread2["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(21, 0, 0, 0)); thread2["Views"] = 0; thread2["Replies"] = 0; thread2["Answered"] = false; thread2["Tags"] = new List<string> { "index", "primarykey", "rangekey" }; threadTable.PutItem(thread2); // Thread 3. var thread3 = new Document(); thread3["ForumName"] = "Amazon S3"; // Hash attribute. thread3["Subject"] = "S3 Thread 1"; // Range attribute. thread3["Message"] = "S3 thread 3 message text"; thread3["LastPostedBy"] = "User A"; thread3["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0, 0)); thread3["Views"] = 0; thread3["Replies"] = 0; thread3["Answered"] = false; thread3["Tags"] = new List<string> { "largeobjects", "multipart upload" }; threadTable.PutItem(thread3); } private static void LoadSampleReplies() { Table replyTable = Table.LoadTable(client, "Reply"); // Reply 1 - thread 1. var thread1Reply1 = new Document(); thread1Reply1["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute. thread1Reply1["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(21, 0, 0, 0)); // Range attribute. thread1Reply1["Message"] = "DynamoDB Thread 1 Reply 1 text"; thread1Reply1["PostedBy"] = "User A"; replyTable.PutItem(thread1Reply1); // Reply 2 - thread 1. var thread1reply2 = new Document(); thread1reply2["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute. thread1reply2["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); // Range attribute. thread1reply2["Message"] = "DynamoDB Thread 1 Reply 2 text"; thread1reply2["PostedBy"] = "User B"; replyTable.PutItem(thread1reply2); // Reply 3 - thread 1. var thread1Reply3 = new Document(); thread1Reply3["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute. thread1Reply3["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0, 0)); // Range attribute. thread1Reply3["Message"] = "DynamoDB Thread 1 Reply 3 text"; thread1Reply3["PostedBy"] = "User B"; replyTable.PutItem(thread1Reply3); // Reply 1 - thread 2. var thread2Reply1 = new Document(); thread2Reply1["Id"] = "Amazon DynamoDB#DynamoDB Thread 2"; // Hash attribute. thread2Reply1["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0, 0)); // Range attribute. thread2Reply1["Message"] = "DynamoDB Thread 2 Reply 1 text"; thread2Reply1["PostedBy"] = "User A"; replyTable.PutItem(thread2Reply1); // Reply 2 - thread 2. var thread2Reply2 = new Document(); thread2Reply2["Id"] = "Amazon DynamoDB#DynamoDB Thread 2"; // Hash attribute. thread2Reply2["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(1, 0, 0, 0)); // Range attribute. thread2Reply2["Message"] = "DynamoDB Thread 2 Reply 2 text"; thread2Reply2["PostedBy"] = "User A"; replyTable.PutItem(thread2Reply2); } } }