摘要:子句確定返回的行。在中,操作可執(zhí)行相同的工作。建議不要對大型表這樣做即使僅返回幾個匹配項目,仍需為整個付費。用于指定一個條件,以便僅返回符合條件的項目。方法每次返回項目的一個子集稱為頁面。響應(yīng)中的值隨后通過參數(shù)傳遞給方法。提供值替換功能。
查詢Query上一節(jié)我們介紹了DynamoDB索引的創(chuàng)建及管理,這一節(jié)我們將介紹query(查詢)和scan(掃描)的使用。
SQL 可使用 SELECT 語句查詢關(guān)鍵列、非關(guān)鍵列或任意組合。WHERE 子句確定返回的行。
DynamoDB Query 操作提供對存儲數(shù)據(jù)的物理位置的快速高效訪問。 可以將 Query 用于任何具有復(fù)合主鍵(分區(qū)鍵和排序鍵)的表。這里的表必須指定分區(qū)鍵的相等條件,并且可以選擇性為排序鍵提供另一個條件。 KeyConditionExpression 參數(shù)指定要查詢的鍵值。
可使用可選 FilterExpression 在結(jié)果中的找出某些符號條件的項目。
在 DynamoDB 中,必須使用 ExpressionAttributeValues 作為表達式參數(shù)(例如,KeyConditionExpression和 FilterExpression)中的占位符。這類似于在關(guān)系數(shù)據(jù)庫中使用綁定變量,在運行時將實際值代入 SELECT語句。 下邊是query的語法:
response = table.query( IndexName="string", Select="ALL_ATTRIBUTES"|"ALL_PROJECTED_ATTRIBUTES"|"SPECIFIC_ATTRIBUTES"|"COUNT", AttributesToGet=[ "string", ], Limit=123, ConsistentRead=True|False, ConditionalOperator="AND"|"OR", ScanIndexForward=True|False, ExclusiveStartKey={ "string": "string"|123|Binary(b"bytes")|True|None|set(["string"])|set([123])|set([Binary(b"bytes")])|[]|{} }, ReturnConsumedCapacity="INDEXES"|"TOTAL"|"NONE", ProjectionExpression="string", FilterExpression=Attr("myattribute").eq("myvalue"), KeyConditionExpression=Key("mykey").eq("myvalue"), ExpressionAttributeNames={ "string": "string" }, ExpressionAttributeValues={ "string": "string"|123|Binary(b"bytes")|True|None|set(["string"])|set([123])|set([Binary(b"bytes")])|[]|{} } )
參數(shù)說明:
ExclusiveStartKey: 起始查詢的key,也就是上一頁的最后一條數(shù)據(jù)
ConsistentRead: 是否使用強制一致性 默認(rèn)False
ScanIndexForward: 索引的排序方式 True 為正序 False 為倒序 默認(rèn)True
ReturnConsumedCapacity: DynamoDB 將返回條件寫入期間使用的寫入容量單位數(shù)
TOTAL 會返回由表及其所有g(shù)lobal secondary index占用的寫入容量;
INDEXES 僅返回由global secondary index占用的寫入容量;
NONE 表示您不需要返回任何占用容量統(tǒng)計數(shù)據(jù)。
ProjectionExpression: 用于指定要在掃描結(jié)果中包含的屬性
FilterExpression: 指定一個條件,以便僅返回符合條件的項目
KeyConditionExpression: 要查詢的鍵值
ExpressionAttributeNames: 提供名稱替換功能
ExpressionAttributeValues: 提供值替換功能
以下是 DynamoDB 中的幾個 Query 示例:
返回 Aritist = "No One You Know" SongTitle="Call Me Today" 的歌曲:
{ TableName: "Music", KeyConditionExpression: "Artist = :a and SongTitle = :t", ExpressionAttributeValues: { ":a": "No One You Know", ":t": "Call Me Today" } }
返回 Aitist="No One You Know" 的所以歌曲:
{ TableName: "Music", KeyConditionExpression: "Artist = :a", ExpressionAttributeValues: { ":a": "No One You Know" } }
返回Aritist ="No One You Know" 并且 SongTitle 開頭為Call 的所有歌曲:
{ TableName: "Music", KeyConditionExpression: "Artist = :a and begins_with(SongTitle, :t)", ExpressionAttributeValues: { ":a": "No One You Know", ":t": "Call" } }
返回Aritist ="No One You Know" 并且 SongTitle 開頭為Today 并且價格小于1 的所有歌曲:
{ TableName: "Music", KeyConditionExpression: "Artist = :a and contains(SongTitle, :t)", FilterExpression: "price < :p", ExpressionAttributeValues: { ":a": "No One You Know", ":t": "Today", ":p": 1.00 } }Python Example
boto3
返回 Aitist="The Acme Band" 的所有歌曲:
# ... from boto3.dynamodb.conditions import Key, Attr table = db3.Table("Music") response = table.query( KeyConditionExpression=Key("Artist").eq("The Acme Band") ) items = response["Items"] print(items) ## output [ { u"Genre": u"Rock", u"Price": Decimal("0.99"), u"Artist": u"The Acme Band", u"SongTitle": u"Look Out, World", u"AlbumTitle": u"The Buck Starts Here" }, { u"Artist": u"The Acme Band", u"Price": Decimal("2.47"), u"AlbumTitle": u"The Buck Starts Here", u"PromotionInfo": { u"RadioStationsPlaying": [u"KHCR", u"KBQX", u"WTNR", u"WJJH"], u"Rotation": u"Heavy", u"TourDates": {u"Seattle": u"20150625", u"Cleveland": u"20150630"} }, u"Genre": u"Rock", u"SongTitle": u"Still In Love" } ]
返回 Artist="No One You Know" 并且SongTitle="Somewhere Down The Road" 的所有歌曲:
response = table.query( KeyConditionExpression=Key("Artist").eq("No One You Know") & Key("SongTitle").eq("Somewhere Down The Road") ) items = response["Items"] print(items) ## output [{ u"Artist": u"No One You Know", u"AlbumTitle": u"Somewhat Famous", u"CriticRating": Decimal("8.4"), u"Year": Decimal("1984"), u"Genre": u"Country", u"SongTitle": u"Somewhere Down The Road" } ]
返回Aritist ="No One You Know" 并且 SongTitle 開頭為 Call 的所有歌曲:
response = table.query( KeyConditionExpression=Key("Artist").eq("The Acme Band") & Key("SongTitle").begins_with("Look") ) items = response["Items"] print(items) ## output [ { u"Genre": u"Rock", u"Price": Decimal("0.99"), u"Artist": u"The Acme Band", u"SongTitle": u"Look Out, World", u"AlbumTitle": u"The Buck Starts Here" } ]
返回Aritist ="No One You Know" 并且 SongTitle 開頭為Today 并且價格小于1 的所有歌曲:
response = table.query( KeyConditionExpression=Key("Artist").eq("The Acme Band"), FilterExpression=Attr("Price").lt(1) ) items = response["Items"] print(items) ## output [{ u"Genre": u"Rock", u"Price": Decimal("0.99"), u"Artist": u"The Acme Band", u"SongTitle": u"Look Out, World", u"AlbumTitle": u"The Buck Starts Here" }, ]Note
特別注意: 如果篩選條件是排序鍵,則是先過濾再返回結(jié)果,和SQL中where 篩選類似。 如果排序值不是排序建,則先返回結(jié)果再過濾。
例如:
表結(jié)構(gòu)和項目值如下:
Table Test: a: hash_key b: range_key c: number for i in range(10): Test(a=1, b=i*10, c=i*20)
查詢:
response = table.query( KeyConditionExpression=Key("a").eq("1") & Key("b").gt("40"), Limit=2 ) 查詢結(jié)果為兩個項目: a=1, b=50, c=80 a=1, b=60, c=100 response = table.query( KeyConditionExpression=Key("a").eq("1"), FilterExpression=Attr("c").gt("80"), Limit=2 ) 會發(fā)現(xiàn)查詢沒有結(jié)果。 這是因為DynamoDB 會默認(rèn)按照 b 正序排列,limit=2 則限定了結(jié)果為: a=1, b=10, c=20 a=1, b=20, c=40 可以看出,這個結(jié)果中并沒有符合 c > 80 的項目。 所以 結(jié)果為空。 不過還是會占讀取吞吐量。Scan
在 SQL 中,不帶 WHERE 子句的 SELECT 語句將返回表中的每個行。在 DynamoDB 中,Scan 操作可執(zhí)行相同的工作。在這兩種情況下,您都可以檢索所有項目或部分項目。 無論您使用的是 SQL 還是 NoSQL 數(shù)據(jù)庫,都應(yīng)謹(jǐn)慎使用掃描操作,因為它們會占用大量系統(tǒng)資源
在 SQL 中,可在不指定 WHERE 子句的情況下使用 SELECT 語句掃描表并檢索其所有數(shù)據(jù)。您可以在結(jié)果中請求一個或多個列。或者,如果您使用通配符 (*),則可請求所有列。 下面是一些示例:
/* Return all of the data in the table */ SELECT * FROM Music; /* Return all of the values for Artist and Title */ SELECT Artist, Title FROM Music;
DynamoDB 提供以相似方式工作的 Scan 操作。 下面是Scan 的語法示例:
response = table.scan( IndexName="string", AttributesToGet=[ "string", ], Limit=123, Select="ALL_ATTRIBUTES"|"ALL_PROJECTED_ATTRIBUTES"|"SPECIFIC_ATTRIBUTES"|"COUNT", ConditionalOperator="AND"|"OR", ExclusiveStartKey={ "string": "string"|123|Binary(b"bytes")|True|None|set(["string"])|set([123])|set([Binary(b"bytes")])|[]|{} }, ReturnConsumedCapacity="INDEXES"|"TOTAL"|"NONE", TotalSegments=123, Segment=123, ProjectionExpression="string", FilterExpression=Attr("myattribute").eq("myvalue"), ExpressionAttributeNames={ "string": "string" }, ExpressionAttributeValues={ "string": "string"|123|Binary(b"bytes")|True|None|set(["string"])|set([123])|set([Binary(b"bytes")])|[]|{} }, ConsistentRead=True|False )
參數(shù)說明:
ExclusiveStartKey: 起始查詢的key,也就是上一頁的最后一條數(shù)據(jù)
ConsistentRead: 是否使用強制一致性 默認(rèn)False
ScanIndexForward: 索引的排序方式 True 為正序 False 為倒序 默認(rèn)True
ReturnConsumedCapacity: DynamoDB 將返回條件寫入期間使用的寫入容量單位數(shù)
TOTAL 會返回由表及其所有g(shù)lobal secondary index占用的寫入容量;
INDEXES 僅返回由global secondary index占用的寫入容量;
NONE 表示您不需要返回任何占用容量統(tǒng)計數(shù)據(jù)。
ProjectionExpression: 用于指定要在掃描結(jié)果中包含的屬性
FilterExpression: 指定一個條件,以便僅返回符合條件的項目
KeyConditionExpression: 要查詢的鍵值
ExpressionAttributeNames: 提供名稱替換功能
ExpressionAttributeValues: 提供值替換功能
scan 的查詢方式是先掃描所有數(shù)據(jù),篩選條件也僅在掃描整個表后進行應(yīng)用,所以會占用大量的讀取吞吐量。
下面是一些示例:
// Return all of the data in the table { TableName: "Music" } // Return all of the values for Artist and Title { TableName: "Music", ProjectionExpression: "Artist, Title" }
Scan 操作還提供一個 FilterExpression 參數(shù)以過濾符合條件的項目。在掃描整個表后且結(jié)果返回之前,應(yīng)用 FilterExpression。(建議不要對大型表這樣做:即使僅返回幾個匹配項目,仍需為整個 Scan 付費。會占用吞吐量)
Python Exampleboto3
返回Aritist ="No One You Know" 并且 SongTitle 開頭為Today 并且價格小于1 的所有歌曲:
response = table.scan( FilterExpression=Attr("Price").lt(2)&Key("Artist").eq("The Acme Band") ) items = response["Items"] print(items) ## output [{ u"Genre": u"Rock", u"Price": Decimal("0.99"), u"Artist": u"The Acme Band", u"SongTitle": u"Look Out, World", u"AlbumTitle": u"The Buck Starts Here" },]
在代碼中,請注意以下情況:
ProjectionExpression 用于指定要在掃描結(jié)果中包含的屬性。
FilterExpression 用于指定一個條件,以便僅返回符合條件的項目。所有其他項目都將被舍棄。
scan 方法每次返回項目的一個子集(稱為頁面)。響應(yīng)中的 LastEvaluatedKey 值隨后通過 ExclusiveStartKey 參數(shù)傳遞給 scan 方法。當(dāng)返回最后一頁后,LastEvaluatedKey 將不是響應(yīng)的一部分。
Note
ExpressionAttributeNames 提供名稱替換功能。我們使用此參數(shù)是因為 year 是 DynamoDB 中的保留字,您不能直接在任何表達式中使用它,包括 KeyConditionExpression。我們使用表達式屬性名稱 #yr 來解決此問題。
ExpressionAttributeValues 提供值替換功能。我們使用此參數(shù)是因為您不能在任何表達式中使用文字,包括 KeyConditionExpression。我們使用表達式屬性值 :yyyy 來解決此問題。
這一節(jié)我們介紹了DynamoDB query和scan的基本用法,下一節(jié)將介紹使用索引查詢
tips:
從這幾篇的介紹可以發(fā)現(xiàn)DynamoDB的查詢語法比較繁瑣,寫起來非常麻煩,所以我模仿sqlalchemy 寫了一個orm,歡迎使用https://github.com/gusibi/dynamodb-py
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/17583.html
摘要:子句確定返回的行。在中,操作可執(zhí)行相同的工作。建議不要對大型表這樣做即使僅返回幾個匹配項目,仍需為整個付費。用于指定一個條件,以便僅返回符合條件的項目。方法每次返回項目的一個子集稱為頁面。響應(yīng)中的值隨后通過參數(shù)傳遞給方法。提供值替換功能。 上一節(jié)我們介紹了DynamoDB索引的創(chuàng)建及管理,這一節(jié)我們將介紹query(查詢)和scan(掃描)的使用。 查詢Query SQL 可使用 SE...
摘要:上一節(jié)我們介紹了項目的添加修改獲取刪除操作,這一節(jié)將介紹索引的創(chuàng)建及管理。創(chuàng)建索引在關(guān)系數(shù)據(jù)庫中,索引是一個數(shù)據(jù)結(jié)構(gòu),可對表中的不同的列執(zhí)行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關(guān)系數(shù)據(jù)庫還是,在創(chuàng)建索引時都應(yīng)謹(jǐn)慎。 上一節(jié)我們介紹了項目的添加、修改、獲取、刪除(CRUD)操作,這一節(jié)將介紹索引的創(chuàng)建及管理。 創(chuàng)建索引 在關(guān)系數(shù)據(jù)庫中,索引是一個數(shù)據(jù)結(jié)構(gòu),可對表中的...
閱讀 3768·2021-08-30 09:47
閱讀 3690·2019-08-30 15:56
閱讀 677·2019-08-30 14:18
閱讀 698·2019-08-29 16:17
閱讀 2065·2019-08-29 11:07
閱讀 642·2019-08-26 13:53
閱讀 3443·2019-08-26 10:26
閱讀 2491·2019-08-23 18:30