国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Amazon DynamoDB 入門6:query 和 scan

fox_soyoung / 1259人閱讀

摘要:子句確定返回的行。在中,操作可執(zhí)行相同的工作。建議不要對大型表這樣做即使僅返回幾個匹配項目,仍需為整個付費。用于指定一個條件,以便僅返回符合條件的項目。方法每次返回項目的一個子集稱為頁面。響應(yīng)中的值隨后通過參數(shù)傳遞給方法。提供值替換功能。

上一節(jié)我們介紹了DynamoDB索引的創(chuàng)建及管理,這一節(jié)我們將介紹query(查詢)和scan(掃描)的使用。

查詢Query

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 Example

boto3

返回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

相關(guān)文章

  • Amazon DynamoDB 入門6query scan

    摘要:子句確定返回的行。在中,操作可執(zhí)行相同的工作。建議不要對大型表這樣做即使僅返回幾個匹配項目,仍需為整個付費。用于指定一個條件,以便僅返回符合條件的項目。方法每次返回項目的一個子集稱為頁面。響應(yīng)中的值隨后通過參數(shù)傳遞給方法。提供值替換功能。 上一節(jié)我們介紹了DynamoDB索引的創(chuàng)建及管理,這一節(jié)我們將介紹query(查詢)和scan(掃描)的使用。 查詢Query SQL 可使用 SE...

    animabear 評論0 收藏0
  • Amazon DynamoDB 入門5:索引創(chuàng)建及管理

    摘要:上一節(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),可對表中的...

    bitkylin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<