摘要:子句確定返回的行。在中,操作可執(zhí)行相同的工作。建議不要對(duì)大型表這樣做即使僅返回幾個(gè)匹配項(xiàng)目,仍需為整個(gè)付費(fèi)。用于指定一個(gè)條件,以便僅返回符合條件的項(xiàng)目。方法每次返回項(xiàng)目的一個(gè)子集稱(chēng)為頁(yè)面。響應(yīng)中的值隨后通過(guò)參數(shù)傳遞給方法。提供值替換功能。
查詢(xún)Query上一節(jié)我們介紹了DynamoDB索引的創(chuàng)建及管理,這一節(jié)我們將介紹query(查詢(xún))和scan(掃描)的使用。
SQL 可使用 SELECT 語(yǔ)句查詢(xún)關(guān)鍵列、非關(guān)鍵列或任意組合。WHERE 子句確定返回的行。
DynamoDB Query 操作提供對(duì)存儲(chǔ)數(shù)據(jù)的物理位置的快速高效訪問(wèn)。 可以將 Query 用于任何具有復(fù)合主鍵(分區(qū)鍵和排序鍵)的表。這里的表必須指定分區(qū)鍵的相等條件,并且可以選擇性為排序鍵提供另一個(gè)條件。 KeyConditionExpression 參數(shù)指定要查詢(xún)的鍵值。
可使用可選 FilterExpression 在結(jié)果中的找出某些符號(hào)條件的項(xiàng)目。
在 DynamoDB 中,必須使用 ExpressionAttributeValues 作為表達(dá)式參數(shù)(例如,KeyConditionExpression和 FilterExpression)中的占位符。這類(lèi)似于在關(guān)系數(shù)據(jù)庫(kù)中使用綁定變量,在運(yùn)行時(shí)將實(shí)際值代入 SELECT語(yǔ)句。 下邊是query的語(yǔ)法:
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ù)說(shuō)明:
ExclusiveStartKey: 起始查詢(xún)的key,也就是上一頁(yè)的最后一條數(shù)據(jù)
ConsistentRead: 是否使用強(qiáng)制一致性 默認(rèn)False
ScanIndexForward: 索引的排序方式 True 為正序 False 為倒序 默認(rèn)True
ReturnConsumedCapacity: DynamoDB 將返回條件寫(xiě)入期間使用的寫(xiě)入容量單位數(shù)
TOTAL 會(huì)返回由表及其所有g(shù)lobal secondary index占用的寫(xiě)入容量;
INDEXES 僅返回由global secondary index占用的寫(xiě)入容量;
NONE 表示您不需要返回任何占用容量統(tǒng)計(jì)數(shù)據(jù)。
ProjectionExpression: 用于指定要在掃描結(jié)果中包含的屬性
FilterExpression: 指定一個(gè)條件,以便僅返回符合條件的項(xiàng)目
KeyConditionExpression: 要查詢(xún)的鍵值
ExpressionAttributeNames: 提供名稱(chēng)替換功能
ExpressionAttributeValues: 提供值替換功能
以下是 DynamoDB 中的幾個(gè) 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 開(kāi)頭為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 開(kāi)頭為T(mén)oday 并且價(jià)格小于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 開(kāi)頭為 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 開(kāi)頭為T(mén)oday 并且價(jià)格小于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
特別注意: 如果篩選條件是排序鍵,則是先過(guò)濾再返回結(jié)果,和SQL中where 篩選類(lèi)似。 如果排序值不是排序建,則先返回結(jié)果再過(guò)濾。
例如:
表結(jié)構(gòu)和項(xiàng)目值如下:
Table Test: a: hash_key b: range_key c: number for i in range(10): Test(a=1, b=i*10, c=i*20)
查詢(xún):
response = table.query( KeyConditionExpression=Key("a").eq("1") & Key("b").gt("40"), Limit=2 ) 查詢(xún)結(jié)果為兩個(gè)項(xiàng)目: 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 ) 會(huì)發(fā)現(xiàn)查詢(xún)沒(méi)有結(jié)果。 這是因?yàn)镈ynamoDB 會(huì)默認(rèn)按照 b 正序排列,limit=2 則限定了結(jié)果為: a=1, b=10, c=20 a=1, b=20, c=40 可以看出,這個(gè)結(jié)果中并沒(méi)有符合 c > 80 的項(xiàng)目。 所以 結(jié)果為空。 不過(guò)還是會(huì)占讀取吞吐量。Scan
在 SQL 中,不帶 WHERE 子句的 SELECT 語(yǔ)句將返回表中的每個(gè)行。在 DynamoDB 中,Scan 操作可執(zhí)行相同的工作。在這兩種情況下,您都可以檢索所有項(xiàng)目或部分項(xiàng)目。 無(wú)論您使用的是 SQL 還是 NoSQL 數(shù)據(jù)庫(kù),都應(yīng)謹(jǐn)慎使用掃描操作,因?yàn)樗鼈儠?huì)占用大量系統(tǒng)資源
在 SQL 中,可在不指定 WHERE 子句的情況下使用 SELECT 語(yǔ)句掃描表并檢索其所有數(shù)據(jù)。您可以在結(jié)果中請(qǐng)求一個(gè)或多個(gè)列。或者,如果您使用通配符 (*),則可請(qǐng)求所有列。 下面是一些示例:
/* 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 的語(yǔ)法示例:
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ù)說(shuō)明:
ExclusiveStartKey: 起始查詢(xún)的key,也就是上一頁(yè)的最后一條數(shù)據(jù)
ConsistentRead: 是否使用強(qiáng)制一致性 默認(rèn)False
ScanIndexForward: 索引的排序方式 True 為正序 False 為倒序 默認(rèn)True
ReturnConsumedCapacity: DynamoDB 將返回條件寫(xiě)入期間使用的寫(xiě)入容量單位數(shù)
TOTAL 會(huì)返回由表及其所有g(shù)lobal secondary index占用的寫(xiě)入容量;
INDEXES 僅返回由global secondary index占用的寫(xiě)入容量;
NONE 表示您不需要返回任何占用容量統(tǒng)計(jì)數(shù)據(jù)。
ProjectionExpression: 用于指定要在掃描結(jié)果中包含的屬性
FilterExpression: 指定一個(gè)條件,以便僅返回符合條件的項(xiàng)目
KeyConditionExpression: 要查詢(xún)的鍵值
ExpressionAttributeNames: 提供名稱(chēng)替換功能
ExpressionAttributeValues: 提供值替換功能
scan 的查詢(xún)方式是先掃描所有數(shù)據(jù),篩選條件也僅在掃描整個(gè)表后進(jìn)行應(yīng)用,所以會(huì)占用大量的讀取吞吐量。
下面是一些示例:
// 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 操作還提供一個(gè) FilterExpression 參數(shù)以過(guò)濾符合條件的項(xiàng)目。在掃描整個(gè)表后且結(jié)果返回之前,應(yīng)用 FilterExpression。(建議不要對(duì)大型表這樣做:即使僅返回幾個(gè)匹配項(xiàng)目,仍需為整個(gè) Scan 付費(fèi)。會(huì)占用吞吐量)
Python Exampleboto3
返回Aritist ="No One You Know" 并且 SongTitle 開(kāi)頭為T(mén)oday 并且價(jià)格小于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" },]
在代碼中,請(qǐng)注意以下情況:
ProjectionExpression 用于指定要在掃描結(jié)果中包含的屬性。
FilterExpression 用于指定一個(gè)條件,以便僅返回符合條件的項(xiàng)目。所有其他項(xiàng)目都將被舍棄。
scan 方法每次返回項(xiàng)目的一個(gè)子集(稱(chēng)為頁(yè)面)。響應(yīng)中的 LastEvaluatedKey 值隨后通過(guò) ExclusiveStartKey 參數(shù)傳遞給 scan 方法。當(dāng)返回最后一頁(yè)后,LastEvaluatedKey 將不是響應(yīng)的一部分。
Note
ExpressionAttributeNames 提供名稱(chēng)替換功能。我們使用此參數(shù)是因?yàn)?year 是 DynamoDB 中的保留字,您不能直接在任何表達(dá)式中使用它,包括 KeyConditionExpression。我們使用表達(dá)式屬性名稱(chēng) #yr 來(lái)解決此問(wèn)題。
ExpressionAttributeValues 提供值替換功能。我們使用此參數(shù)是因?yàn)槟荒茉谌魏伪磉_(dá)式中使用文字,包括 KeyConditionExpression。我們使用表達(dá)式屬性值 :yyyy 來(lái)解決此問(wèn)題。
這一節(jié)我們介紹了DynamoDB query和scan的基本用法,下一節(jié)將介紹使用索引查詢(xún)
tips:
從這幾篇的介紹可以發(fā)現(xiàn)DynamoDB的查詢(xún)語(yǔ)法比較繁瑣,寫(xiě)起來(lái)非常麻煩,所以我模仿sqlalchemy 寫(xiě)了一個(gè)orm,歡迎使用https://github.com/gusibi/dynamodb-py
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/17583.html
摘要:子句確定返回的行。在中,操作可執(zhí)行相同的工作。建議不要對(duì)大型表這樣做即使僅返回幾個(gè)匹配項(xiàng)目,仍需為整個(gè)付費(fèi)。用于指定一個(gè)條件,以便僅返回符合條件的項(xiàng)目。方法每次返回項(xiàng)目的一個(gè)子集稱(chēng)為頁(yè)面。響應(yīng)中的值隨后通過(guò)參數(shù)傳遞給方法。提供值替換功能。 上一節(jié)我們介紹了DynamoDB索引的創(chuàng)建及管理,這一節(jié)我們將介紹query(查詢(xún))和scan(掃描)的使用。 查詢(xún)Query SQL 可使用 SE...
摘要:上一節(jié)我們介紹了項(xiàng)目的添加修改獲取刪除操作,這一節(jié)將介紹索引的創(chuàng)建及管理。創(chuàng)建索引在關(guān)系數(shù)據(jù)庫(kù)中,索引是一個(gè)數(shù)據(jù)結(jié)構(gòu),可對(duì)表中的不同的列執(zhí)行快速查詢(xún)。但是,全局二級(jí)索引僅支持最終一致性。無(wú)論使用的是關(guān)系數(shù)據(jù)庫(kù)還是,在創(chuàng)建索引時(shí)都應(yīng)謹(jǐn)慎。 上一節(jié)我們介紹了項(xiàng)目的添加、修改、獲取、刪除(CRUD)操作,這一節(jié)將介紹索引的創(chuàng)建及管理。 創(chuàng)建索引 在關(guān)系數(shù)據(jù)庫(kù)中,索引是一個(gè)數(shù)據(jù)結(jié)構(gòu),可對(duì)表中的...
閱讀 3780·2021-08-30 09:47
閱讀 3710·2019-08-30 15:56
閱讀 682·2019-08-30 14:18
閱讀 703·2019-08-29 16:17
閱讀 2070·2019-08-29 11:07
閱讀 648·2019-08-26 13:53
閱讀 3452·2019-08-26 10:26
閱讀 2499·2019-08-23 18:30