すべてのプロダクト
Search
ドキュメントセンター

Tablestore:データの読み取り

最終更新日:Dec 28, 2024

Tablestore は、データを読み取るための複数の操作を提供します。GetRow 操作を呼び出して単一のデータ行を読み取ったり、BatchGetRow 操作を呼び出して一度に複数のデータ行を読み取ったり、GetRange 操作を呼び出して主キー値が指定された範囲内にあるデータを読み取ったりできます。

クエリメソッド

Tablestore は、データを読み取るための GetRow、BatchGetRow、および GetRange 操作を提供します。データを読み取る前に、実際のクエリシナリオに基づいて適切なクエリメソッドを選択してください。

重要

自動インクリメント主キー列を含むテーブルからデータを読み取る場合は、自動インクリメント主キー列の値を含むすべての主キー列の値をクエリしていることを確認してください。詳細については、自動インクリメント主キー列の設定 を参照してください。自動インクリメント主キー列に値が記録されていない場合は、GetRange 操作を呼び出して、最初の主キー列の主キー値に基づいてデータが読み取られる範囲を指定できます。

クエリメソッド

説明

シナリオ

単一のデータ行の読み取り

GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。

このメソッドは、テーブルのすべての主キー列を特定でき、読み取る行数が少ないシナリオに適用できます。

複数行のデータの一括読み取り

BatchGetRow 操作を呼び出して、1 つ以上のテーブルから一度に複数のデータ行を読み取ることができます。

BatchGetRow 操作は、複数の GetRow 操作で構成されます。サブ操作を構築するプロセスは、GetRow 操作を呼び出すプロセスと同じです。

このメソッドは、テーブルのすべての主キー列を特定でき、読み取る行数が多い場合や、複数のテーブルからデータを読み取るシナリオに適用できます。

主キー値が特定の範囲内にあるデータの読み取り

GetRange 操作を呼び出して、主キー値が指定された範囲内にあるデータを読み取ることができます。

GetRange 操作を使用すると、主キー値が指定された範囲内にあるデータを前方または後方に読み取ることができます。読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行の主キーに関する情報が返されます。前回の操作で返された次の行の主キー情報に基づいて、最後の操作が中断された場所から開始し、残りの行を読み取るリクエストを開始できます。

このメソッドは、テーブルのすべての主キー列の範囲または主キー列のプレフィックスを特定できるシナリオに適用できます。

重要

主キー列のプレフィックスを特定できない場合は、データが INF_MIN タイプの開始主キー列と、データが INF_MAX タイプの終了主キー列を指定して、テーブルのすべての主キー列の範囲を特定できます。この操作はテーブル内のすべてのデータをスキャンしますが、大量の計算リソースを消費します。注意して進めてください。

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化 を参照してください。

  • データテーブルが作成され、データがデータテーブルに書き込まれていること。

単一のデータ行の読み取り

GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。GetRow 操作を呼び出した後、次のいずれかの結果が返される場合があります。

  • 行が存在する場合、行の主キー列と属性列が返されます。

  • 行が存在しない場合、行は返されず、エラーも報告されません。

API 操作

// テーブル内のデータ行を返します。
// @param GetRowRequest             GetRow 操作の呼び出しに必要なパラメータをカプセル化します。
// @return  GetRowResponse          GetRow 操作へのレスポンスの内容。
GetRow(request *GetRowRequest) (*GetRowResponse, error)                   

パラメータ

パラメータ

説明

TableName

テーブルの名前。

PrimaryKey

行の主キー情報。主キー情報は、主キー列名、主キータイプ、および主キー値で構成されます。

重要

指定する主キー列の数とタイプは、テーブル内の実際の主キー列の数とタイプと同じである必要があります。

ColumnsToGet

読み取る列。主キー列または属性列の名前を指定できます。

  • 列を指定しない場合、行内のすべてのデータが返されます。

  • 列を指定したが、行に指定された列が含まれていない場合、戻り値は null です。行に指定された列の一部が含まれている場合、行の指定された列の一部にあるデータが返されます。

説明
  • デフォルトでは、Tablestore は行をクエリするときに、行のすべての列からデータを返します。ColumnsToGet パラメータを使用して、特定の列からデータを返すことができます。col0 と col1 が ColumnsToGet パラメータに追加されている場合、col0 列と col1 列の値のみが返されます。

  • ColumnsToGet パラメータと Filter パラメータの両方を指定した場合、Tablestore は ColumnsToGet パラメータで指定された列をクエリし、フィルタ条件を満たす行を返します。

MaxVersion

読み取ることができるデータバージョンの最大数。

重要

MaxVersion パラメータと TimeRange パラメータの少なくとも 1 つを指定する必要があります。

  • MaxVersion パラメータのみを指定した場合、指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

  • TimeRange パラメータのみを指定した場合、バージョンが指定された時間範囲内にあるすべてのデータ、または指定されたバージョンのデータが返されます。

  • MaxVersion パラメータと TimeRange パラメータの両方を指定した場合、指定された時間範囲内で指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

TimeRange

読み取るバージョンの時間範囲、または特定のバージョン。詳細については、TimeRange を参照してください。

重要

MaxVersion パラメータと TimeRange パラメータの少なくとも 1 つを指定する必要があります。

  • MaxVersion パラメータのみを指定した場合、指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

  • TimeRange パラメータのみを指定した場合、バージョンが指定された時間範囲内にあるすべてのデータ、または指定されたバージョンのデータが返されます。

  • MaxVersion パラメータと TimeRange パラメータの両方を指定した場合、指定された時間範囲内で指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

  • バージョンが特定の時間範囲内にあるデータをクエリするには、start_time パラメータと end_time パラメータを指定する必要があります。start_time パラメータは開始タイムスタンプを指定します。end_time パラメータは終了タイムスタンプを指定します。指定された範囲は、[start_time, end_time) 形式の左閉右開区間です。

  • 特定のバージョンのデータをクエリするには、specific_time パラメータを指定する必要があります。specific_time パラメータは特定のタイムスタンプを指定します。

specific_time と [start_time, end_time) のいずれか 1 つが必要です。

TimeRange パラメータの有効な値:0 ~ INT64.MAX。単位:ミリ秒。

Filter

サーバー側でクエリ結果をフィルタリングするために使用するフィルタ。フィルタ条件を満たす行のみが返されます。詳細については、フィルタ を参照してください。

説明

ColumnsToGet パラメータと Filter パラメータの両方を指定した場合、Tablestore は ColumnsToGet パラメータで指定された列をクエリし、フィルタ条件を満たす行を返します。

サンプルコード

次のサンプルコードは、データ行を読み取る方法の例を示しています。

// テーブル内のデータ行を返します。
// @param GetRowRequest             GetRow 操作の呼び出しに必要なパラメータをカプセル化します。
// @return  GetRowResponse          GetRow 操作へのレスポンスの内容。
getRowRequest := new(tablestore.GetRowRequest)
criteria := new(tablestore.SingleRowQueryCriteria);
putPk := new(tablestore.PrimaryKey)
putPk.AddPrimaryKeyColumn("pk1", "pk1value1")
putPk.AddPrimaryKeyColumn("pk2", int64(2))
putPk.AddPrimaryKeyColumn("pk3", []byte("pk3"))

criteria.PrimaryKey = putPk
getRowRequest.SingleRowQueryCriteria = criteria
getRowRequest.SingleRowQueryCriteria.TableName = tableName 
getRowRequest.SingleRowQueryCriteria.MaxVersion = 1  
getResp, err := client.GetRow(getRowRequest)
if err != nil {
    fmt.Println("getrow failed with error:", err) // getrow がエラーで失敗しました:
} else {
    fmt.Println("get row col0 result is ",getResp.Columns[0].ColumnName, getResp.Columns[0].Value,) // get row col0 の結果は
}                   

詳細なサンプルコードを表示するには、GetRow@GitHub を参照してください。

複数行のデータの一括読み取り

BatchGetRow 操作を呼び出して、1 つ以上のテーブルから一度に複数のデータ行を読み取ることができます。BatchGetRow 操作は、複数の GetRow 操作で構成されます。BatchGetRow 操作を呼び出す場合、各 GetRow 操作を構築するプロセスは、GetRow 操作を呼び出す場合に GetRow 操作を構築するプロセスと同じです。

BatchGetRow 操作を呼び出すと、各 GetRow 操作は個別に実行され、Tablestore は各 GetRow 操作へのレスポンスを個別に返します。

使用上の注意

  • BatchGetRow 操作を呼び出して一度に複数の行を読み取ると、一部の行の読み取りに失敗する場合があります。この場合、Tablestore は例外を返さず、失敗した行に関する情報を含む BatchGetRowResponse を返します。したがって、BatchGetRow 操作を呼び出すときは、戻り値をチェックして、各行からデータが正常に読み取られたかどうかを確認する必要があります。

  • BatchGetRow 操作では、すべての行に同じパラメータ設定を使用します。たとえば、ColumnsToGet パラメータが [colA] に設定されている場合、colA 列の値のみがすべての行から読み取られます。

  • BatchGetRow 操作を呼び出して、一度に最大 100 行を読み取ることができます。

パラメータ

パラメータの詳細については、「単一のデータ行の読み取り」セクションのパラメータテーブルを参照してください。

API 操作

// テーブルから複数のデータ行を返します。
// @param BatchGetRowRequest             BatchGetRow 操作の呼び出しに必要なパラメータをカプセル化します。
// @return  BatchGetRowResponse          BatchGetRow 操作へのレスポンスの内容。
BatchGetRow(request *BatchGetRowRequest) (*BatchGetRowResponse, error)                    

サンプルコード

次のサンプルコードは、一度に 10 行のデータを読み取る方法の例を示しています。

batchGetReq := &tablestore.BatchGetRowRequest{}
mqCriteria := &tablestore.MultiRowQueryCriteria{}

for i := 0; i < 10; i++ {
    pkToGet := new(tablestore.PrimaryKey)
    pkToGet.AddPrimaryKeyColumn("pk1", "pk1value1")
    pkToGet.AddPrimaryKeyColumn("pk2", int64(i))
    pkToGet.AddPrimaryKeyColumn("pk3", []byte("pk3"))
    mqCriteria.AddRow(pkToGet)
    mqCriteria.MaxVersion = 1
}
mqCriteria.TableName = tableName
batchGetReq.MultiRowQueryCriteria = append(batchGetReq.MultiRowQueryCriteria, mqCriteria)
batchGetResponse, err := client.BatchGetRow(batchGetReq)

if err != nil {
    fmt.Println("batchget failed with error:", err) // batchget がエラーで失敗しました:
} else {
    fmt.Println("batchget finished") // batchget が完了しました
}                    

詳細なサンプルコードを表示するには、BatchGetRow@GitHub を参照してください。

主キー値が特定の範囲内にあるデータの読み取り

GetRange 操作を呼び出して、主キー値が指定された範囲内にあるデータを読み取ることができます。

GetRange 操作を使用すると、主キー値が指定された範囲内にあるデータを前方または後方に読み取ることができます。読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行の主キーに関する情報が返されます。前回の操作で返された次の行の主キー情報に基づいて、最後の操作が中断された場所から開始し、残りの行を読み取るリクエストを開始できます。

説明

Tablestore テーブルでは、すべての行は主キーでソートされます。テーブルの主キーは、すべての主キー列で順番に構成されます。したがって、行は特定の主キー列に基づいてソートされません。

使用上の注意

GetRange 操作は、左端一致の原則に従います。Tablestore は、最初の主キー列から最後の主キー列まで順番に値を比較して、主キー値が指定された範囲内にあるデータを読み取ります。たとえば、データテーブルの主キーが PK1、PK2、PK3 という主キー列で構成されているとします。データを読み取るとき、Tablestore はまず、行の PK1 値が最初の主キー列に指定された範囲内にあるかどうかを判断します。行の PK1 値が範囲内にある場合、Tablestore は、行の他の主キー列の値が各主キー列に指定された範囲内にあるかどうかの判断を停止し、行を返します。行の PK1 値が範囲内にない場合、Tablestore は、PK1 と同じ方法で、行の他の主キー列の値が各主キー列に指定された範囲内にあるかどうかを判断し続けます。

次のいずれかの条件が満たされると、GetRange 操作が停止してデータが返される場合があります。

  • スキャンされたデータ量が 4 MB に達する。

  • スキャンされた行数が 5,000 に達する。

  • 返された行数が上限に達する。

  • 予約済みの読み取りスループットがすべて消費されているため、読み取りスループットが次のデータ行を読み取るのに不十分である。

API 操作

// テーブル内の、主キー値が指定された範囲内にある複数のデータ行をクエリします。
// @param GetRangeRequest            GetRange 操作の呼び出しに必要なパラメータをカプセル化します。
// @return GetRangeResponse          GetRange 操作へのレスポンスの内容。
GetRange(request *GetRangeRequest) (*GetRangeResponse,error)                   

パラメータ

パラメータ

説明

TableName

テーブルの名前。

Direction

レスポンス内の行をソートする順序。

  • このパラメータを FORWARD に設定した場合、開始主キー値は終了主キー値よりも小さくする必要があり、レスポンス内の行は主キー値の昇順でソートされます。

  • このパラメータを BACKWARD に設定した場合、開始主キー値は終了主キー値よりも大きくする必要があり、レスポンス内の行は主キー値の降順でソートされます。

たとえば、テーブルに A と B という 2 つの主キー値があり、値 A は値 B よりも小さいとします。Direction パラメータを FORWARD に設定し、テーブルに [A, B) 範囲を指定した場合、Tablestore は、主キー値が値 A 以上で値 B 未満の行を、値 A から値 B への昇順で返します。Direction パラメータを BACKWARD に設定し、テーブルに [B, A) 範囲を指定した場合、Tablestore は、主キー値が値 B 以下で値 A よりも大きい行を、値 B から値 A への降順で返します。

StartPrimaryKey

読み取る範囲の開始主キー情報と終了主キー情報。開始主キー列と終了主キー列は、有効な主キー列、またはデータが INF_MIN タイプと INF_MAX タイプの仮想列である必要があります。仮想列で指定された範囲内の列の数は、指定されたテーブルの主キー列の数と同じである必要があります。

INF_MIN は無限に小さい値を示します。他のすべてのタイプの値は、INF_MIN タイプの値よりも大きくなります。INF_MAX は無限に大きい値を示します。他のすべてのタイプの値は、INF_MAX タイプの値よりも小さくなります。

  • StartPrimaryKey パラメータは、開始主キー列と値を指定します。行に開始主キー列が含まれている場合、この行のデータが返されます。

  • EndPrimaryKey パラメータは、終了主キー列と値を指定します。行に終了主キー列が含まれている場合、この行のデータは返されません。

テーブル内の行は、主キー値に基づいて昇順でソートされます。データの読み取りに使用される範囲は、左閉右開区間です。データを順方向に読み取る場合、主キー値が開始主キー値以上で終了主キー値未満の行が返されます。

EndPrimaryKey

Limit

返される行の最大数。このパラメータの値は 0 よりも大きくする必要があります。

Tablestore は、指定された範囲内の一部の行が返されていない場合でも、順方向または逆方向に返される行の最大数に達すると操作を停止します。レスポンスで返された NextStartPrimaryKey パラメータの値を使用して、次のリクエストでデータを読み取ることができます。

ColumnsToGet

読み取る列。主キー列または属性列の名前を指定できます。

  • 列を指定しない場合、行内のすべてのデータが返されます。

  • 列を指定したが、行に指定された列が含まれていない場合、戻り値は null です。行に指定された列の一部が含まれている場合、行の指定された列の一部にあるデータが返されます。

説明
  • デフォルトでは、Tablestore は行をクエリするときに、行のすべての列からデータを返します。ColumnsToGet パラメータを使用して、特定の列からデータを返すことができます。col0 と col1 が ColumnsToGet パラメータに追加されている場合、col0 列と col1 列の値のみが返されます。

  • 主キー値に基づいて読み取るように指定した範囲内にあっても、返すように指定した列が含まれていない行は、レスポンスから除外されます。

  • ColumnsToGet パラメータと Filter パラメータの両方を指定した場合、Tablestore は ColumnsToGet パラメータで指定された列をクエリし、フィルタ条件を満たす行を返します。

MaxVersions

読み取ることができるデータバージョンの最大数。

重要

MaxVersion パラメータと TimeRange パラメータの少なくとも 1 つを指定する必要があります。

  • MaxVersion パラメータのみを指定した場合、指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

  • TimeRange パラメータのみを指定した場合、バージョンが指定された時間範囲内にあるすべてのデータ、または指定されたバージョンのデータが返されます。

  • MaxVersion パラメータと TimeRange パラメータの両方を指定した場合、指定された時間範囲内で指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

TimeRange

読み取るバージョンの時間範囲、または特定のバージョン。詳細については、TimeRange を参照してください。

重要

MaxVersion パラメータと TimeRange パラメータの少なくとも 1 つを指定する必要があります。

  • MaxVersion パラメータのみを指定した場合、指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

  • TimeRange パラメータのみを指定した場合、バージョンが指定された時間範囲内にあるすべてのデータ、または指定されたバージョンのデータが返されます。

  • MaxVersion パラメータと TimeRange パラメータの両方を指定した場合、指定された時間範囲内で指定された数のバージョンのデータが、最新のデータエントリから最も古いデータエントリまで返されます。

  • バージョンが特定の時間範囲内にあるデータをクエリするには、start_time パラメータと end_time パラメータを指定する必要があります。start_time パラメータは開始タイムスタンプを指定します。end_time パラメータは終了タイムスタンプを指定します。指定された範囲は、[start_time, end_time) 形式の左閉右開区間です。

  • 特定のバージョンのデータをクエリするには、specific_time パラメータを指定する必要があります。specific_time パラメータは特定のタイムスタンプを指定します。

specific_time と [start_time, end_time) のいずれか 1 つが必要です。

TimeRange パラメータの有効な値:0 ~ INT64.MAX。単位:ミリ秒。

Filter

サーバー側でクエリ結果をフィルタリングするために使用するフィルタ。フィルタ条件を満たす行のみが返されます。詳細については、フィルタ を参照してください。

説明

ColumnsToGet パラメータと Filter パラメータの両方を指定した場合、Tablestore は ColumnsToGet パラメータで指定された列をクエリし、フィルタ条件を満たす行を返します。

NextStartPrimaryKey

次の読み取りリクエストの開始主キー情報。NextStartPrimaryKey パラメータの値を使用して、すべてのデータが読み取られたかどうかを判断できます。

  • レスポンスで NextStartPrimaryKey パラメータの値が空でない場合、その値を次の GetRange 操作の開始主キー情報として使用できます。

  • レスポンスで NextStartPrimaryKey パラメータの値が空の場合、範囲内のすべてのデータが返されます。

サンプルコード

次のサンプルコードは、主キー値が指定された範囲内にあるデータを読み取る方法の例を示しています。

// テーブル内の、主キー値が指定された範囲内にある複数のデータ行をクエリします。
// @param GetRangeRequest            GetRange 操作の呼び出しに必要なパラメータをカプセル化します。
// @return GetRangeResponse          GetRange 操作へのレスポンスの内容。
getRangeRequest := &tablestore.GetRangeRequest{}
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = tableName

startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumnWithMinValue("pk1")
startPK.AddPrimaryKeyColumnWithMinValue("pk2")
startPK.AddPrimaryKeyColumnWithMinValue("pk3")
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumnWithMaxValue("pk1")
endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
endPK.AddPrimaryKeyColumnWithMaxValue("pk3")
rangeRowQueryCriteria.StartPrimaryKey = startPK
rangeRowQueryCriteria.EndPrimaryKey = endPK
rangeRowQueryCriteria.Direction = tablestore.FORWARD
rangeRowQueryCriteria.MaxVersion = 1
rangeRowQueryCriteria.Limit = 10
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria

getRangeResp, err := client.GetRange(getRangeRequest)

fmt.Println("get range result is " ,getRangeResp) // get range の結果は

for {
    if err != nil {
        fmt.Println("get range failed with error:", err) // get range がエラーで失敗しました:
    }
    for _, row := range getRangeResp.Rows {
        fmt.Println("range get row with key", row.PrimaryKey.PrimaryKeys[0].Value, row.PrimaryKey.PrimaryKeys[1].Value, row.PrimaryKey.PrimaryKeys[2].Value) // キーを使用して range get row を取得します
    }
    if getRangeResp.NextStartPrimaryKey == nil {
        break
    } else {
        fmt.Println("next pk is :", getRangeResp.NextStartPrimaryKey.PrimaryKeys[0].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[1].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[2].Value) // 次の pk は:
        getRangeRequest.RangeRowQueryCriteria.StartPrimaryKey = getRangeResp.NextStartPrimaryKey
        getRangeResp, err = client.GetRange(getRangeRequest)
    }
    fmt.Println("continue to query rows") // 行のクエリを続行します
}
fmt.Println("range get row finished") // range get row が完了しました

詳細なサンプルコードを表示するには、GetRange@GitHub を参照してください。