上一節咱們介紹了DynamoDB 表的操做,這一節將介紹項目的添加 修改 獲取 刪除操做。數據庫
Amazon DynamoDB 提供了 PutItem 和 BatchWriteItem 兩種方式寫入數據json
在 Amazon DynamoDB 中,使用 PutItem 操做向表添加項目:app
{ TableName: "Music", Item: { "Artist":"No One You Know", "SongTitle":"Call Me Today", "AlbumTitle":"Somewhat Famous", "Year": 2015, "Price": 2.14, "Genre": "Country", "Tags": { "Composers": [ "Smith", "Jones", "Davis" ], "LengthInSeconds": 214 } } }
此表的主鍵包含 Artist 和 SongTitle。您必須爲這些屬性指定值。
如下是要了解的有關此 PutItem 示例的幾個關鍵事項:性能
DynamoDB 使用 JSON 提供對文檔的本機支持。這使得 DynamoDB 很是適合存儲半結構化數據,例如 Tags。您也能夠從 JSON 文檔中檢索和操做數據。 優化
除了主鍵(Artist 和 SongTitle),Music 表沒有預約義的屬性。 url
大多數 SQL 數據庫是面向事務的。當您發出 INSERT 語句時,數據修改不是永久性的,直至您發出 COMMIT 語句。利用 Amazon DynamoDB,當 DynamoDB 經過 HTTP 200 狀態代碼 (OK) 進行回覆時,PutItem 操做的效果是永久性的。 code
boto3server
# ... table = db3.Table('Music') table.put_item( Item = { "Artist": "No One You Know", "SongTitle": "My Dog Spot", "AlbumTitle": "Hey Now", "Price": Decimal('1.98'), "Genre": "Country", "CriticRating": Decimal('8.4') } ) Out[98]: {'ResponseMetadata': {'HTTPHeaders': {'content-length': '2', 'content-type': 'application/x-amz-json-1.0', 'server': 'Jetty(8.1.12.v20130726)', 'x-amz-crc32': '2745614147', 'x-amzn-requestid': 'c7c6be12-9752-403f-97b1-a9ac451a0a98'}, 'HTTPStatusCode': 200, 'RequestId': 'c7c6be12-9752-403f-97b1-a9ac451a0a98', 'RetryAttempts': 0}} table.put_item( Item = { "Artist": "No One You Know", "SongTitle": "Somewhere Down The Road", "AlbumTitle":"Somewhat Famous", "Genre": "Country", "CriticRating": Decimal('8.4'), "Year": 1984 } ) table.put_item( Item = { "Artist": "The Acme Band", "SongTitle": "Still In Love", "AlbumTitle":"The Buck Starts Here", "Price": Decimal('2.47'), "Genre": "Rock", "PromotionInfo": { "RadioStationsPlaying":[ "KHCR", "KBQX", "WTNR", "WJJH" ], "TourDates": { "Seattle": "20150625", "Cleveland": "20150630" }, "Rotation": "Heavy" } } ) table.put_item( Item = { "Artist": "The Acme Band", "SongTitle": "Look Out, World", "AlbumTitle":"The Buck Starts Here", "Price": Decimal('0.99'), "Genre": "Rock" } )
Note排序
PutItem 是覆蓋操做,若是主鍵相同,第二次執行將覆蓋掉以前的數據索引
除了 PutItem 以外,Amazon DynamoDB 還支持同時寫入多個(最多25個)項目的 BatchWriteItem 操做。
boto3
# ... table = db3.Table('Music') with table.batch_writer() as batch: batch.put_item( Item = { "Artist": "The Acme Band", "SongTitle": "Look Out, World", "AlbumTitle":"The Buck Starts Here", "Price": Decimal('0.99'), "Genre": "Rock" } ) batch.put_item( Item = { "Artist": "The Acme Band 0", "SongTitle": "Look Out, World", "AlbumTitle":"The Buck Starts Here", "Price": Decimal('1.99'), "Genre": "Rock" } ) batch.put_item( Item = { "Artist": "The Acme Band 1", "SongTitle": "Look Out, World", "AlbumTitle":"The Buck Starts Here", "Price": Decimal('2.99'), "Genre": "Rock" } ) batch.put_item( Item = { "Artist": "The Acme Band 1", "SongTitle": "Look Out, World", "AlbumTitle":"The Buck Starts Here", } )
BatchWriteItem 使用 overwrite_by_pkeys=['partition_key','sort_key'] 參數去除項目中重複的部分。
with table.batch_writer(overwrite_by_pkeys=['partition_key', 'sort_key']) as batch: batch.put_item( Item={ 'partition_key': 'p1', 'sort_key': 's1', 'other': '111', } ) batch.put_item( Item={ 'partition_key': 'p1', 'sort_key': 's1', 'other': '222', } )
去重後,等同於:
with table.batch_writer(overwrite_by_pkeys=['partition_key', 'sort_key']) as batch: batch.put_item( Item={ 'partition_key': 'p1', 'sort_key': 's1', 'other': '222', } )
利用 SQL,咱們可使用 SELECT 語句從表中檢索一個或多個行。可以使用 WHERE 子句來肯定返回給您的數據
DynamoDB 提供如下操做來讀取數據:
GetItem - 從表中檢索單個項目。這是讀取單個項目的最高效方式,由於它將提供對項目的物理位置的直接訪問。(DynamoDB 還提供 BatchGetItem 操做,在單個操做中執行最多 100 個 GetItem 調用。)
Query - 檢索具備特定分區鍵的全部項目。在這些項目中,您能夠將條件應用於排序鍵並僅檢索一部分數據。Query提供對存儲數據的分區的快速高效的訪問。
Scan - 檢索指定表中的全部項目。
Note
利用關係數據庫,您可使用 SELECT 語句聯接多個表中的數據並返回結果。聯接是關係模型的基礎。要確保聯接高效執行,應持續優化數據庫及其應用程序的性能。
DynamoDB 是一個非關係 NoSQL 數據庫且不支持表聯接。相反,應用程序一次從一個表中讀取數據。
DynamoDB 提供 GetItem 操做來按項目的主鍵檢索項目。
默認狀況下,GetItem 將返回整個項目及其全部屬性。
{ TableName: "Music", Key: { "Artist": "No One You Know", "SongTitle": "Call Me Today" } }
能夠添加 ProjectionExpression 參數以僅返回一些屬性:
{ TableName: "Music", Key: { "Artist": "No One You Know", "SongTitle": "Call Me Today" }, "ProjectionExpression": "AlbumTitle, Price" }
DynamoDB GetItem 操做很是高效:此操做使用主鍵值肯定相關項目的準確存儲位置,並直接此位置檢索該項目。
SQL SELECT 語句支持多種查詢和表掃描。DynamoDB 經過其 Query 和 Scan 操做提供類似功能,如查詢表和掃描表中所述。
SQL SELECT 語句可執行表聯接,這容許您同時從多個表中檢索數據。DynamoDB 是一個非關係數據庫。所以,它不支持表聯接。
Query 和 Scan 操做將在以後的章節詳細介紹。
boto3
# ... table = db3.Table('Music') response = table.get_item( Key={ "Artist": "The Acme Band", "SongTitle": "Still In Love" } ) item = response['Item'] print(item) # output { "Artist": "The Acme Band", "SongTitle": "Still In Love", "AlbumTitle":"The Buck Starts Here", "Price": Decimal('2.47'), "Genre": "Rock", "PromotionInfo": { "RadioStationsPlaying":[ "KHCR", "KBQX", "WTNR", "WJJH" ], "TourDates": { "Seattle": "20150625", "Cleveland": "20150630" }, "Rotation": "Heavy" } } response = table.get_item( Key={ "Artist": "The Acme Band", "SongTitle": "Still In Love" }, ProjectionExpression = "AlbumTitle, Price" ) item = response['Item'] print(item) { 'AlbumTitle': u'The Buck Starts Here', 'Price': Decimal('2.47') }
SQL 語言提供用於修改數據的 UPDATE 語句。DynamoDB 使用 UpdateItem 操做完成相似的任務。
在 DynamoDB 中,可以使用 UpdateItem 操做修改單個項目。(若是要修改多個項目,則必須使用多個 UpdateItem 操做。)
示例以下:
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET RecordLabel = :label", ExpressionAttributeValues: { ":label": "Global Records" } }
必須指定要修改的項目的 Key 屬性和一個用於指定屬性值的 UpdateExpression。
UpdateItem 替換整個項目,而不是替換單個屬性。
UpdateItem 的行爲與「upsert」操做的行爲相似:若是項目位於表中,則更新項目,不然添加(插入)新項目。
UpdateItem 支持條件寫入,在此狀況下,操做僅在特定 ConditionExpression 的計算結果爲 true 時成功完成
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET RecordLabel = :label", ConditionExpression: "Price >= :p", ExpressionAttributeValues: { ":label": "Global Records", ":p": 2.00 } }
UpdateItem 還支持原子計數器或類型爲 Number 的屬性(可遞增或遞減)。
如下是一個 UpdateItem 操做的示例,它初始化一個新屬性 (Plays) 來跟蹤歌曲的已播放次數:
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET Plays = :val", ExpressionAttributeValues: { ":val": 0 }, ReturnValues: "UPDATED_NEW" }
ReturnValues 參數設置爲 UPDATED_NEW,這將返回已更新的任何屬性的新值。在此示例中,它返回 0(零)。
當某人播放此歌曲時,可以使用如下 UpdateItem 操做來將 Plays 增長 1:
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET Plays = Plays + :incr", ExpressionAttributeValues: { ":incr": 1 }, ReturnValues: "UPDATED_NEW" }
boto3
使用 UpdateItem 操做修改單個項目
import boto3 import json import decimal class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): if o % 1 > 0: return float(o) else: return int(o) return super(DecimalEncoder, self).default(o) db3 = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000") table = db3.Table('Music') response = table.update_item( Key={ "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression="SET RecordLabel = :label", ExpressionAttributeValues={ ":label": "Global Records" }, ReturnValues="UPDATED_NEW" ) print(json.dumps(response, indent=4, cls=DecimalEncoder))
UpdateItem 條件寫入 價格大於或等於 2.00 UpdateItem 執行更新
table = db3.Table('Music') response = table.update_item( Key={ "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression="SET RecordLabel = :label", ConditionExpression="Price >= :p", ExpressionAttributeValues={ ":label": "Global Records", ":p": 2.00 }, ReturnValues="UPDATED_NEW" )
UpdateItem 操做的示例,它初始化一個新屬性 (Plays) 來跟蹤歌曲的已播放次數
table = db3.Table('Music') response = table.update_item( Key={ "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression="SET Plays = :val", ExpressionAttributeValues={ ":val": 0 }, ReturnValues="UPDATED_NEW" )
使用 UpdateItem 操做來將 Plays 增長 1
table = db3.Table('Music') response = table.update_item( Key={ "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression="SET Plays = Plays + :incr", ExpressionAttributeValues={ ":incr": 1 }, ReturnValues="UPDATED_NEW" )
在 SQL 中,DELETE 語句從表中刪除一個或多個行。DynamoDB 使用 DeleteItem 操做一次刪除一個項目。
在 DynamoDB 中,可以使用 DeleteItem 操做從表中刪除數據(一次刪除一個項目)。您必須指定項目的主鍵值。示例以下:
{ TableName: "Music", Key: { Artist: "The Acme Band", SongTitle: "Look Out, World" } }
Note
除了 DeleteItem 以外,Amazon DynamoDB 還支持同時刪除多個項目的 BatchWriteItem 操做。
DeleteItem 支持條件寫入,在此狀況下,操做僅在特定 ConditionExpression 的計算結果爲 true 時成功完成。例如,如下 DeleteItem 操做僅在項目具備 RecordLabel 屬性時刪除項目:
{ TableName: "Music", Key: { Artist: "The Acme Band", SongTitle: "Look Out, World" }, ConditionExpression: "attribute_exists(RecordLabel)" }
boto3
table = db3.Table('Music') table.delete_item( Key={ 'AlbumTitle': 'Hey Now' 'Artist': 'No One You Know' } )
這一節咱們介紹了項目的基本操做(CRUD),下一節將介紹索引的建立和管理。