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

資訊專欄INFORMATION COLUMN

Amazon DynamoDB 入門6:query 和 scan

animabear / 1964人閱讀

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

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

查詢Query

SQL 可使用 SELECT 語句查詢關鍵列、非關鍵列或任意組合。WHERE 子句確定返回的行。

DynamoDB Query 操作提供對存儲數據的物理位置的快速高效訪問。 可以將 Query 用于任何具有復合主鍵(分區鍵和排序鍵)的表。這里的表必須指定分區鍵的相等條件,并且可以選擇性為排序鍵提供另一個條件。 KeyConditionExpression 參數指定要查詢的鍵值。

可使用可選 FilterExpression 在結果中的找出某些符號條件的項目。

在 DynamoDB 中,必須使用 ExpressionAttributeValues 作為表達式參數(例如,KeyConditionExpression和 FilterExpression)中的占位符。這類似于在關系數據庫中使用綁定變量,在運行時將實際值代入 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")])|[]|{}
    }
)

參數說明:

ExclusiveStartKey: 起始查詢的key,也就是上一頁的最后一條數據

ConsistentRead: 是否使用強制一致性 默認False

ScanIndexForward: 索引的排序方式 True 為正序 False 為倒序 默認True

ReturnConsumedCapacity: DynamoDB 將返回條件寫入期間使用的寫入容量單位數

TOTAL 會返回由表及其所有global secondary index占用的寫入容量;

INDEXES 僅返回由global secondary index占用的寫入容量;

NONE 表示您不需要返回任何占用容量統計數據。

ProjectionExpression: 用于指定要在掃描結果中包含的屬性

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

特別注意: 如果篩選條件是排序鍵,則是先過濾再返回結果,和SQL中where 篩選類似。 如果排序值不是排序建,則先返回結果再過濾。

例如:

表結構和項目值如下:

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
)

查詢結果為兩個項目:

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
)

會發現查詢沒有結果。

這是因為DynamoDB 會默認按照 b 正序排列,limit=2 則限定了結果為:
a=1, b=10, c=20
a=1, b=20, c=40

可以看出,這個結果中并沒有符合 c > 80 的項目。
所以 結果為空。

不過還是會占讀取吞吐量。
Scan

在 SQL 中,不帶 WHERE 子句的 SELECT 語句將返回表中的每個行。在 DynamoDB 中,Scan 操作可執行相同的工作。在這兩種情況下,您都可以檢索所有項目或部分項目。 無論您使用的是 SQL 還是 NoSQL 數據庫,都應謹慎使用掃描操作,因為它們會占用大量系統資源

在 SQL 中,可在不指定 WHERE 子句的情況下使用 SELECT 語句掃描表并檢索其所有數據。您可以在結果中請求一個或多個列。或者,如果您使用通配符 (*),則可請求所有列。 下面是一些示例:

/* 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
)

參數說明:

ExclusiveStartKey: 起始查詢的key,也就是上一頁的最后一條數據

ConsistentRead: 是否使用強制一致性 默認False

ScanIndexForward: 索引的排序方式 True 為正序 False 為倒序 默認True

ReturnConsumedCapacity: DynamoDB 將返回條件寫入期間使用的寫入容量單位數

TOTAL 會返回由表及其所有global secondary index占用的寫入容量;

INDEXES 僅返回由global secondary index占用的寫入容量;

NONE 表示您不需要返回任何占用容量統計數據。

ProjectionExpression: 用于指定要在掃描結果中包含的屬性

FilterExpression: 指定一個條件,以便僅返回符合條件的項目

KeyConditionExpression: 要查詢的鍵值

ExpressionAttributeNames: 提供名稱替換功能

ExpressionAttributeValues: 提供值替換功能

scan 的查詢方式是先掃描所有數據,篩選條件也僅在掃描整個表后進行應用,所以會占用大量的讀取吞吐量。

下面是一些示例:

// 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 參數以過濾符合條件的項目。在掃描整個表后且結果返回之前,應用 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 用于指定要在掃描結果中包含的屬性。

FilterExpression 用于指定一個條件,以便僅返回符合條件的項目。所有其他項目都將被舍棄。

scan 方法每次返回項目的一個子集(稱為頁面)。響應中的 LastEvaluatedKey 值隨后通過 ExclusiveStartKey 參數傳遞給 scan 方法。當返回最后一頁后,LastEvaluatedKey 將不是響應的一部分。

Note

ExpressionAttributeNames 提供名稱替換功能。我們使用此參數是因為 year 是 DynamoDB 中的保留字,您不能直接在任何表達式中使用它,包括 KeyConditionExpression。我們使用表達式屬性名稱 #yr 來解決此問題。

ExpressionAttributeValues 提供值替換功能。我們使用此參數是因為您不能在任何表達式中使用文字,包括 KeyConditionExpression。我們使用表達式屬性值 :yyyy 來解決此問題。

這一節我們介紹了DynamoDB query和scan的基本用法,下一節將介紹使用索引查詢

tips:
從這幾篇的介紹可以發現DynamoDB的查詢語法比較繁瑣,寫起來非常麻煩,所以我模仿sqlalchemy 寫了一個orm,歡迎使用https://github.com/gusibi/dynamodb-py

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38403.html

相關文章

  • Amazon DynamoDB 入門6query scan

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

    fox_soyoung 評論0 收藏0
  • Amazon DynamoDB 入門5:索引創建及管理

    摘要:上一節我們介紹了項目的添加修改獲取刪除操作,這一節將介紹索引的創建及管理。創建索引在關系數據庫中,索引是一個數據結構,可對表中的不同的列執行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關系數據庫還是,在創建索引時都應謹慎。 上一節我們介紹了項目的添加、修改、獲取、刪除(CRUD)操作,這一節將介紹索引的創建及管理。 創建索引 在關系數據庫中,索引是一個數據結構,可對表中的...

    bitkylin 評論0 收藏0

發表評論

0條評論

animabear

|高級講師

TA的文章

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