LoginSignup
2
3

More than 5 years have passed since last update.

RubyでDynamoDBからデータを取得する時の注意点

Posted at

データ取得時の注意

DynamoDBからデータ取得(scan,query)を行う場合、一回のリクエストで最大1MBしか取得できない様です。

さらに、1MB以上のデータをリクエストした場合切り捨てられエラーにもならない!
(全件取得できてるか判別するステータスはありますが)

解決策

レスポンスをページングして取得。

例えば、

sample.rb
 def client
   Aws::DynamoDB::Client.new
 end

def get_date
   id = XXX
   from = DateTime
   to = DateTime 

   resp = client.query(
     table_name: XXX, #テーブル名
     scan_index_forward: true or false, #order
     key_condition_expression: #ハッシュキー
       'id = :id AND created_at BETWEEN :from AND :to' 
     expression_attribute_values: {
       # ハッシュキーにてプレースホルダとして利用
       :id = id,
       :from = from,
       :to = to
     } 
   )
end

とあった時に


 def client
   Aws::DynamoDB::Client.new
 end

def get_date
+ resp_array = []
   id = XXX
   from = DateTime
   to = DateTime 

   resp = client.query(
     table_name: XXX, #テーブル名
     scan_index_forward: true or false, #order
     key_condition_expression: #ハッシュキー
       'id = :id AND created_at BETWEEN :from AND :to' 
     expression_attribute_values: {
       # ハッシュキーにてプレースホルダとして利用
       :id = id,
       :from = from,
       :to = to
     } 
   )

+  resp.each_page do |page|
+    resp_array.concat(page.items)
+  end
end

とすることで1MB以上のレスポンスでも取得できる。

解説

1行目 resp_array = []で配列を作成。
17行目以下3行でデータをページングして取得。
→取得しきるまで繰り返しresp_arrayへ格納。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3