comparison env/lib/python3.9/site-packages/boto/dynamodb2/layer1.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 # Copyright (c) 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved
2 #
3 # Permission is hereby granted, free of charge, to any person obtaining a
4 # copy of this software and associated documentation files (the
5 # "Software"), to deal in the Software without restriction, including
6 # without limitation the rights to use, copy, modify, merge, publish, dis-
7 # tribute, sublicense, and/or sell copies of the Software, and to permit
8 # persons to whom the Software is furnished to do so, subject to the fol-
9 # lowing conditions:
10 #
11 # The above copyright notice and this permission notice shall be included
12 # in all copies or substantial portions of the Software.
13 #
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 # IN THE SOFTWARE.
21 #
22 from binascii import crc32
23
24 import boto
25 from boto.compat import json
26 from boto.connection import AWSQueryConnection
27 from boto.regioninfo import RegionInfo
28 from boto.exception import JSONResponseError
29 from boto.dynamodb2 import exceptions
30
31
32 class DynamoDBConnection(AWSQueryConnection):
33 """
34 Amazon DynamoDB
35 **Overview**
36
37 This is the Amazon DynamoDB API Reference. This guide provides
38 descriptions and samples of the low-level DynamoDB API. For
39 information about DynamoDB application development, go to the
40 `Amazon DynamoDB Developer Guide`_.
41
42 Instead of making the requests to the low-level DynamoDB API
43 directly from your application, we recommend that you use the AWS
44 Software Development Kits (SDKs). The easy-to-use libraries in the
45 AWS SDKs make it unnecessary to call the low-level DynamoDB API
46 directly from your application. The libraries take care of request
47 authentication, serialization, and connection management. For more
48 information, go to `Using the AWS SDKs with DynamoDB`_ in the
49 Amazon DynamoDB Developer Guide .
50
51 If you decide to code against the low-level DynamoDB API directly,
52 you will need to write the necessary code to authenticate your
53 requests. For more information on signing your requests, go to
54 `Using the DynamoDB API`_ in the Amazon DynamoDB Developer Guide .
55
56 The following are short descriptions of each low-level API action,
57 organized by function.
58
59 **Managing Tables**
60
61
62 + CreateTable - Creates a table with user-specified provisioned
63 throughput settings. You must designate one attribute as the hash
64 primary key for the table; you can optionally designate a second
65 attribute as the range primary key. DynamoDB creates indexes on
66 these key attributes for fast data access. Optionally, you can
67 create one or more secondary indexes, which provide fast data
68 access using non-key attributes.
69 + DescribeTable - Returns metadata for a table, such as table
70 size, status, and index information.
71 + UpdateTable - Modifies the provisioned throughput settings for a
72 table. Optionally, you can modify the provisioned throughput
73 settings for global secondary indexes on the table.
74 + ListTables - Returns a list of all tables associated with the
75 current AWS account and endpoint.
76 + DeleteTable - Deletes a table and all of its indexes.
77
78
79 For conceptual information about managing tables, go to `Working
80 with Tables`_ in the Amazon DynamoDB Developer Guide .
81
82 **Reading Data**
83
84
85 + GetItem - Returns a set of attributes for the item that has a
86 given primary key. By default, GetItem performs an eventually
87 consistent read; however, applications can specify a strongly
88 consistent read instead.
89 + BatchGetItem - Performs multiple GetItem requests for data items
90 using their primary keys, from one table or multiple tables. The
91 response from BatchGetItem has a size limit of 16 MB and returns a
92 maximum of 100 items. Both eventually consistent and strongly
93 consistent reads can be used.
94 + Query - Returns one or more items from a table or a secondary
95 index. You must provide a specific hash key value. You can narrow
96 the scope of the query using comparison operators against a range
97 key value, or on the index key. Query supports either eventual or
98 strong consistency. A single response has a size limit of 1 MB.
99 + Scan - Reads every item in a table; the result set is eventually
100 consistent. You can limit the number of items returned by
101 filtering the data attributes, using conditional expressions. Scan
102 can be used to enable ad-hoc querying of a table against non-key
103 attributes; however, since this is a full table scan without using
104 an index, Scan should not be used for any application query use
105 case that requires predictable performance.
106
107
108 For conceptual information about reading data, go to `Working with
109 Items`_ and `Query and Scan Operations`_ in the Amazon DynamoDB
110 Developer Guide .
111
112 **Modifying Data**
113
114
115 + PutItem - Creates a new item, or replaces an existing item with
116 a new item (including all the attributes). By default, if an item
117 in the table already exists with the same primary key, the new
118 item completely replaces the existing item. You can use
119 conditional operators to replace an item only if its attribute
120 values match certain conditions, or to insert a new item only if
121 that item doesn't already exist.
122 + UpdateItem - Modifies the attributes of an existing item. You
123 can also use conditional operators to perform an update only if
124 the item's attribute values match certain conditions.
125 + DeleteItem - Deletes an item in a table by primary key. You can
126 use conditional operators to perform a delete an item only if the
127 item's attribute values match certain conditions.
128 + BatchWriteItem - Performs multiple PutItem and DeleteItem
129 requests across multiple tables in a single request. A failure of
130 any request(s) in the batch will not cause the entire
131 BatchWriteItem operation to fail. Supports batches of up to 25
132 items to put or delete, with a maximum total request size of 16
133 MB.
134
135
136 For conceptual information about modifying data, go to `Working
137 with Items`_ and `Query and Scan Operations`_ in the Amazon
138 DynamoDB Developer Guide .
139 """
140 APIVersion = "2012-08-10"
141 DefaultRegionName = "us-east-1"
142 DefaultRegionEndpoint = "dynamodb.us-east-1.amazonaws.com"
143 ServiceName = "DynamoDB"
144 TargetPrefix = "DynamoDB_20120810"
145 ResponseError = JSONResponseError
146
147 _faults = {
148 "ProvisionedThroughputExceededException": exceptions.ProvisionedThroughputExceededException,
149 "LimitExceededException": exceptions.LimitExceededException,
150 "ConditionalCheckFailedException": exceptions.ConditionalCheckFailedException,
151 "ResourceInUseException": exceptions.ResourceInUseException,
152 "ResourceNotFoundException": exceptions.ResourceNotFoundException,
153 "InternalServerError": exceptions.InternalServerError,
154 "ItemCollectionSizeLimitExceededException": exceptions.ItemCollectionSizeLimitExceededException,
155 }
156
157 NumberRetries = 10
158
159
160 def __init__(self, **kwargs):
161 region = kwargs.pop('region', None)
162 validate_checksums = kwargs.pop('validate_checksums', True)
163 if not region:
164 region_name = boto.config.get('DynamoDB', 'region',
165 self.DefaultRegionName)
166 for reg in boto.dynamodb2.regions():
167 if reg.name == region_name:
168 region = reg
169 break
170
171 # Only set host if it isn't manually overwritten
172 if 'host' not in kwargs:
173 kwargs['host'] = region.endpoint
174
175 super(DynamoDBConnection, self).__init__(**kwargs)
176 self.region = region
177 self._validate_checksums = boto.config.getbool(
178 'DynamoDB', 'validate_checksums', validate_checksums)
179 self.throughput_exceeded_events = 0
180
181 def _required_auth_capability(self):
182 return ['hmac-v4']
183
184 def batch_get_item(self, request_items, return_consumed_capacity=None):
185 """
186 The BatchGetItem operation returns the attributes of one or
187 more items from one or more tables. You identify requested
188 items by primary key.
189
190 A single operation can retrieve up to 16 MB of data, which can
191 contain as many as 100 items. BatchGetItem will return a
192 partial result if the response size limit is exceeded, the
193 table's provisioned throughput is exceeded, or an internal
194 processing failure occurs. If a partial result is returned,
195 the operation returns a value for UnprocessedKeys . You can
196 use this value to retry the operation starting with the next
197 item to get.
198
199 For example, if you ask to retrieve 100 items, but each
200 individual item is 300 KB in size, the system returns 52 items
201 (so as not to exceed the 16 MB limit). It also returns an
202 appropriate UnprocessedKeys value so you can get the next page
203 of results. If desired, your application can include its own
204 logic to assemble the pages of results into one data set.
205
206 If none of the items can be processed due to insufficient
207 provisioned throughput on all of the tables in the request,
208 then BatchGetItem will return a
209 ProvisionedThroughputExceededException . If at least one of
210 the items is successfully processed, then BatchGetItem
211 completes successfully, while returning the keys of the unread
212 items in UnprocessedKeys .
213
214 If DynamoDB returns any unprocessed items, you should retry
215 the batch operation on those items. However, we strongly
216 recommend that you use an exponential backoff algorithm . If
217 you retry the batch operation immediately, the underlying read
218 or write requests can still fail due to throttling on the
219 individual tables. If you delay the batch operation using
220 exponential backoff, the individual requests in the batch are
221 much more likely to succeed.
222
223 For more information, go to `Batch Operations and Error
224 Handling`_ in the Amazon DynamoDB Developer Guide .
225
226 By default, BatchGetItem performs eventually consistent reads
227 on every table in the request. If you want strongly consistent
228 reads instead, you can set ConsistentRead to `True` for any or
229 all tables.
230
231 In order to minimize response latency, BatchGetItem retrieves
232 items in parallel.
233
234 When designing your application, keep in mind that DynamoDB
235 does not return attributes in any particular order. To help
236 parse the response by item, include the primary key values for
237 the items in your request in the AttributesToGet parameter.
238
239 If a requested item does not exist, it is not returned in the
240 result. Requests for nonexistent items consume the minimum
241 read capacity units according to the type of read. For more
242 information, see `Capacity Units Calculations`_ in the Amazon
243 DynamoDB Developer Guide .
244
245 :type request_items: map
246 :param request_items:
247 A map of one or more table names and, for each table, the corresponding
248 primary keys for the items to retrieve. Each table name can be
249 invoked only once.
250
251 Each element in the map consists of the following:
252
253
254 + Keys - An array of primary key attribute values that define specific
255 items in the table. For each primary key, you must provide all of
256 the key attributes. For example, with a hash type primary key, you
257 only need to specify the hash attribute. For a hash-and-range type
258 primary key, you must specify both the hash attribute and the range
259 attribute.
260 + AttributesToGet - One or more attributes to be retrieved from the
261 table. By default, all attributes are returned. If a specified
262 attribute is not found, it does not appear in the result. Note that
263 AttributesToGet has no effect on provisioned throughput
264 consumption. DynamoDB determines capacity units consumed based on
265 item size, not on the amount of data that is returned to an
266 application.
267 + ConsistentRead - If `True`, a strongly consistent read is used; if
268 `False` (the default), an eventually consistent read is used.
269
270 :type return_consumed_capacity: string
271 :param return_consumed_capacity: A value that if set to `TOTAL`, the
272 response includes ConsumedCapacity data for tables and indexes. If
273 set to `INDEXES`, the response includes ConsumedCapacity for
274 indexes. If set to `NONE` (the default), ConsumedCapacity is not
275 included in the response.
276
277 """
278 params = {'RequestItems': request_items, }
279 if return_consumed_capacity is not None:
280 params['ReturnConsumedCapacity'] = return_consumed_capacity
281 return self.make_request(action='BatchGetItem',
282 body=json.dumps(params))
283
284 def batch_write_item(self, request_items, return_consumed_capacity=None,
285 return_item_collection_metrics=None):
286 """
287 The BatchWriteItem operation puts or deletes multiple items in
288 one or more tables. A single call to BatchWriteItem can write
289 up to 16 MB of data, which can comprise as many as 25 put or
290 delete requests. Individual items to be written can be as
291 large as 400 KB.
292
293
294 BatchWriteItem cannot update items. To update items, use the
295 UpdateItem API.
296
297
298 The individual PutItem and DeleteItem operations specified in
299 BatchWriteItem are atomic; however BatchWriteItem as a whole
300 is not. If any requested operations fail because the table's
301 provisioned throughput is exceeded or an internal processing
302 failure occurs, the failed operations are returned in the
303 UnprocessedItems response parameter. You can investigate and
304 optionally resend the requests. Typically, you would call
305 BatchWriteItem in a loop. Each iteration would check for
306 unprocessed items and submit a new BatchWriteItem request with
307 those unprocessed items until all items have been processed.
308
309 Note that if none of the items can be processed due to
310 insufficient provisioned throughput on all of the tables in
311 the request, then BatchWriteItem will return a
312 ProvisionedThroughputExceededException .
313
314 If DynamoDB returns any unprocessed items, you should retry
315 the batch operation on those items. However, we strongly
316 recommend that you use an exponential backoff algorithm . If
317 you retry the batch operation immediately, the underlying read
318 or write requests can still fail due to throttling on the
319 individual tables. If you delay the batch operation using
320 exponential backoff, the individual requests in the batch are
321 much more likely to succeed.
322
323 For more information, go to `Batch Operations and Error
324 Handling`_ in the Amazon DynamoDB Developer Guide .
325
326 With BatchWriteItem , you can efficiently write or delete
327 large amounts of data, such as from Amazon Elastic MapReduce
328 (EMR), or copy data from another database into DynamoDB. In
329 order to improve performance with these large-scale
330 operations, BatchWriteItem does not behave in the same way as
331 individual PutItem and DeleteItem calls would For example, you
332 cannot specify conditions on individual put and delete
333 requests, and BatchWriteItem does not return deleted items in
334 the response.
335
336 If you use a programming language that supports concurrency,
337 such as Java, you can use threads to write items in parallel.
338 Your application must include the necessary logic to manage
339 the threads. With languages that don't support threading, such
340 as PHP, you must update or delete the specified items one at a
341 time. In both situations, BatchWriteItem provides an
342 alternative where the API performs the specified put and
343 delete operations in parallel, giving you the power of the
344 thread pool approach without having to introduce complexity
345 into your application.
346
347 Parallel processing reduces latency, but each specified put
348 and delete request consumes the same number of write capacity
349 units whether it is processed in parallel or not. Delete
350 operations on nonexistent items consume one write capacity
351 unit.
352
353 If one or more of the following is true, DynamoDB rejects the
354 entire batch write operation:
355
356
357 + One or more tables specified in the BatchWriteItem request
358 does not exist.
359 + Primary key attributes specified on an item in the request
360 do not match those in the corresponding table's primary key
361 schema.
362 + You try to perform multiple operations on the same item in
363 the same BatchWriteItem request. For example, you cannot put
364 and delete the same item in the same BatchWriteItem request.
365 + There are more than 25 requests in the batch.
366 + Any individual item in a batch exceeds 400 KB.
367 + The total request size exceeds 16 MB.
368
369 :type request_items: map
370 :param request_items:
371 A map of one or more table names and, for each table, a list of
372 operations to be performed ( DeleteRequest or PutRequest ). Each
373 element in the map consists of the following:
374
375
376 + DeleteRequest - Perform a DeleteItem operation on the specified item.
377 The item to be deleted is identified by a Key subelement:
378
379 + Key - A map of primary key attribute values that uniquely identify
380 the ! item. Each entry in this map consists of an attribute name
381 and an attribute value. For each primary key, you must provide all
382 of the key attributes. For example, with a hash type primary key,
383 you only need to specify the hash attribute. For a hash-and-range
384 type primary key, you must specify both the hash attribute and the
385 range attribute.
386
387 + PutRequest - Perform a PutItem operation on the specified item. The
388 item to be put is identified by an Item subelement:
389
390 + Item - A map of attributes and their values. Each entry in this map
391 consists of an attribute name and an attribute value. Attribute
392 values must not be null; string and binary type attributes must
393 have lengths greater than zero; and set type attributes must not be
394 empty. Requests that contain empty values will be rejected with a
395 ValidationException exception. If you specify any attributes that
396 are part of an index key, then the data types for those attributes
397 must match those of the schema in the table's attribute definition.
398
399 :type return_consumed_capacity: string
400 :param return_consumed_capacity: A value that if set to `TOTAL`, the
401 response includes ConsumedCapacity data for tables and indexes. If
402 set to `INDEXES`, the response includes ConsumedCapacity for
403 indexes. If set to `NONE` (the default), ConsumedCapacity is not
404 included in the response.
405
406 :type return_item_collection_metrics: string
407 :param return_item_collection_metrics: A value that if set to `SIZE`,
408 the response includes statistics about item collections, if any,
409 that were modified during the operation are returned in the
410 response. If set to `NONE` (the default), no statistics are
411 returned.
412
413 """
414 params = {'RequestItems': request_items, }
415 if return_consumed_capacity is not None:
416 params['ReturnConsumedCapacity'] = return_consumed_capacity
417 if return_item_collection_metrics is not None:
418 params['ReturnItemCollectionMetrics'] = return_item_collection_metrics
419 return self.make_request(action='BatchWriteItem',
420 body=json.dumps(params))
421
422 def create_table(self, attribute_definitions, table_name, key_schema,
423 provisioned_throughput, local_secondary_indexes=None,
424 global_secondary_indexes=None):
425 """
426 The CreateTable operation adds a new table to your account. In
427 an AWS account, table names must be unique within each region.
428 That is, you can have two tables with same name if you create
429 the tables in different regions.
430
431 CreateTable is an asynchronous operation. Upon receiving a
432 CreateTable request, DynamoDB immediately returns a response
433 with a TableStatus of `CREATING`. After the table is created,
434 DynamoDB sets the TableStatus to `ACTIVE`. You can perform
435 read and write operations only on an `ACTIVE` table.
436
437 You can optionally define secondary indexes on the new table,
438 as part of the CreateTable operation. If you want to create
439 multiple tables with secondary indexes on them, you must
440 create the tables sequentially. Only one table with secondary
441 indexes can be in the `CREATING` state at any given time.
442
443 You can use the DescribeTable API to check the table status.
444
445 :type attribute_definitions: list
446 :param attribute_definitions: An array of attributes that describe the
447 key schema for the table and indexes.
448
449 :type table_name: string
450 :param table_name: The name of the table to create.
451
452 :type key_schema: list
453 :param key_schema: Specifies the attributes that make up the primary
454 key for a table or an index. The attributes in KeySchema must also
455 be defined in the AttributeDefinitions array. For more information,
456 see `Data Model`_ in the Amazon DynamoDB Developer Guide .
457 Each KeySchemaElement in the array is composed of:
458
459
460 + AttributeName - The name of this key attribute.
461 + KeyType - Determines whether the key attribute is `HASH` or `RANGE`.
462
463
464 For a primary key that consists of a hash attribute, you must specify
465 exactly one element with a KeyType of `HASH`.
466
467 For a primary key that consists of hash and range attributes, you must
468 specify exactly two elements, in this order: The first element must
469 have a KeyType of `HASH`, and the second element must have a
470 KeyType of `RANGE`.
471
472 For more information, see `Specifying the Primary Key`_ in the Amazon
473 DynamoDB Developer Guide .
474
475 :type local_secondary_indexes: list
476 :param local_secondary_indexes:
477 One or more local secondary indexes (the maximum is five) to be created
478 on the table. Each index is scoped to a given hash key value. There
479 is a 10 GB size limit per hash key; otherwise, the size of a local
480 secondary index is unconstrained.
481
482 Each local secondary index in the array includes the following:
483
484
485 + IndexName - The name of the local secondary index. Must be unique
486 only for this table.
487 + KeySchema - Specifies the key schema for the local secondary index.
488 The key schema must begin with the same hash key attribute as the
489 table.
490 + Projection - Specifies attributes that are copied (projected) from
491 the table into the index. These are in addition to the primary key
492 attributes and index key attributes, which are automatically
493 projected. Each attribute specification is composed of:
494
495 + ProjectionType - One of the following:
496
497 + `KEYS_ONLY` - Only the index and primary keys are projected into the
498 index.
499 + `INCLUDE` - Only the specified table attributes are projected into
500 the index. The list of projected attributes are in NonKeyAttributes
501 .
502 + `ALL` - All of the table attributes are projected into the index.
503
504 + NonKeyAttributes - A list of one or more non-key attribute names that
505 are projected into the secondary index. The total count of
506 attributes specified in NonKeyAttributes , summed across all of the
507 secondary indexes, must not exceed 20. If you project the same
508 attribute into two different indexes, this counts as two distinct
509 attributes when determining the total.
510
511 :type global_secondary_indexes: list
512 :param global_secondary_indexes:
513 One or more global secondary indexes (the maximum is five) to be
514 created on the table. Each global secondary index in the array
515 includes the following:
516
517
518 + IndexName - The name of the global secondary index. Must be unique
519 only for this table.
520 + KeySchema - Specifies the key schema for the global secondary index.
521 + Projection - Specifies attributes that are copied (projected) from
522 the table into the index. These are in addition to the primary key
523 attributes and index key attributes, which are automatically
524 projected. Each attribute specification is composed of:
525
526 + ProjectionType - One of the following:
527
528 + `KEYS_ONLY` - Only the index and primary keys are projected into the
529 index.
530 + `INCLUDE` - Only the specified table attributes are projected into
531 the index. The list of projected attributes are in NonKeyAttributes
532 .
533 + `ALL` - All of the table attributes are projected into the index.
534
535 + NonKeyAttributes - A list of one or more non-key attribute names that
536 are projected into the secondary index. The total count of
537 attributes specified in NonKeyAttributes , summed across all of the
538 secondary indexes, must not exceed 20. If you project the same
539 attribute into two different indexes, this counts as two distinct
540 attributes when determining the total.
541
542 + ProvisionedThroughput - The provisioned throughput settings for the
543 global secondary index, consisting of read and write capacity
544 units.
545
546 :type provisioned_throughput: dict
547 :param provisioned_throughput: Represents the provisioned throughput
548 settings for a specified table or index. The settings can be
549 modified using the UpdateTable operation.
550 For current minimum and maximum provisioned throughput values, see
551 `Limits`_ in the Amazon DynamoDB Developer Guide .
552
553 """
554 params = {
555 'AttributeDefinitions': attribute_definitions,
556 'TableName': table_name,
557 'KeySchema': key_schema,
558 'ProvisionedThroughput': provisioned_throughput,
559 }
560 if local_secondary_indexes is not None:
561 params['LocalSecondaryIndexes'] = local_secondary_indexes
562 if global_secondary_indexes is not None:
563 params['GlobalSecondaryIndexes'] = global_secondary_indexes
564 return self.make_request(action='CreateTable',
565 body=json.dumps(params))
566
567 def delete_item(self, table_name, key, expected=None,
568 conditional_operator=None, return_values=None,
569 return_consumed_capacity=None,
570 return_item_collection_metrics=None,
571 condition_expression=None,
572 expression_attribute_names=None,
573 expression_attribute_values=None):
574 """
575 Deletes a single item in a table by primary key. You can
576 perform a conditional delete operation that deletes the item
577 if it exists, or if it has an expected attribute value.
578
579 In addition to deleting an item, you can also return the
580 item's attribute values in the same operation, using the
581 ReturnValues parameter.
582
583 Unless you specify conditions, the DeleteItem is an idempotent
584 operation; running it multiple times on the same item or
585 attribute does not result in an error response.
586
587 Conditional deletes are useful for deleting items only if
588 specific conditions are met. If those conditions are met,
589 DynamoDB performs the delete. Otherwise, the item is not
590 deleted.
591
592 :type table_name: string
593 :param table_name: The name of the table from which to delete the item.
594
595 :type key: map
596 :param key: A map of attribute names to AttributeValue objects,
597 representing the primary key of the item to delete.
598 For the primary key, you must provide all of the attributes. For
599 example, with a hash type primary key, you only need to specify the
600 hash attribute. For a hash-and-range type primary key, you must
601 specify both the hash attribute and the range attribute.
602
603 :type expected: map
604 :param expected:
605 There is a newer parameter available. Use ConditionExpression instead.
606 Note that if you use Expected and ConditionExpression at the same
607 time, DynamoDB will return a ValidationException exception.
608
609 This parameter does not support lists or maps.
610
611 A map of attribute/condition pairs. Expected provides a conditional
612 block for the DeleteItem operation.
613
614 Each element of Expected consists of an attribute name, a comparison
615 operator, and one or more values. DynamoDB compares the attribute
616 with the value(s) you supplied, using the comparison operator. For
617 each Expected element, the result of the evaluation is either true
618 or false.
619
620 If you specify more than one element in the Expected map, then by
621 default all of the conditions must evaluate to true. In other
622 words, the conditions are ANDed together. (You can use the
623 ConditionalOperator parameter to OR the conditions instead. If you
624 do this, then at least one of the conditions must evaluate to true,
625 rather than all of them.)
626
627 If the Expected map evaluates to true, then the conditional operation
628 succeeds; otherwise, it fails.
629
630 Expected contains the following:
631
632
633 + AttributeValueList - One or more values to evaluate against the
634 supplied attribute. The number of values in the list depends on the
635 ComparisonOperator being used. For type Number, value comparisons
636 are numeric. String value comparisons for greater than, equals, or
637 less than are based on ASCII character code values. For example,
638 `a` is greater than `A`, and `a` is greater than `B`. For a list of
639 code values, see
640 `http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters`_.
641 For type Binary, DynamoDB treats each byte of the binary data as
642 unsigned when it compares binary values, for example when
643 evaluating query expressions.
644 + ComparisonOperator - A comparator for evaluating attributes in the
645 AttributeValueList . When performing the comparison, DynamoDB uses
646 strongly consistent reads. The following comparison operators are
647 available: `EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL |
648 CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN` The following
649 are descriptions of each comparison operator.
650
651 + `EQ` : Equal. `EQ` is supported for all datatypes, including lists
652 and maps. AttributeValueList can contain only one AttributeValue
653 element of type String, Number, Binary, String Set, Number Set, or
654 Binary Set. If an item contains an AttributeValue element of a
655 different type than the one specified in the request, the value
656 does not match. For example, `{"S":"6"}` does not equal
657 `{"N":"6"}`. Also, `{"N":"6"}` does not equal `{"NS":["6", "2",
658 "1"]}`. > <li>
659 + `NE` : Not equal. `NE` is supported for all datatypes, including
660 lists and maps. AttributeValueList can contain only one
661 AttributeValue of type String, Number, Binary, String Set, Number
662 Set, or Binary Set. If an item contains an AttributeValue of a
663 different type than the one specified in the request, the value
664 does not match. For example, `{"S":"6"}` does not equal
665 `{"N":"6"}`. Also, `{"N":"6"}` does not equal `{"NS":["6", "2",
666 "1"]}`. > <li>
667 + `LE` : Less than or equal. AttributeValueList can contain only one
668 AttributeValue element of type String, Number, or Binary (not a set
669 type). If an item contains an AttributeValue element of a different
670 type than the one specified in the request, the value does not
671 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
672 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
673 + `LT` : Less than. AttributeValueList can contain only one
674 AttributeValue of type String, Number, or Binary (not a set type).
675 If an item contains an AttributeValue element of a different type
676 than the one specified in the request, the value does not match.
677 For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
678 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
679 + `GE` : Greater than or equal. AttributeValueList can contain only one
680 AttributeValue element of type String, Number, or Binary (not a set
681 type). If an item contains an AttributeValue element of a different
682 type than the one specified in the request, the value does not
683 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
684 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
685 + `GT` : Greater than. AttributeValueList can contain only one
686 AttributeValue element of type String, Number, or Binary (not a set
687 type). If an item contains an AttributeValue element of a different
688 type than the one specified in the request, the value does not
689 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
690 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
691 + `NOT_NULL` : The attribute exists. `NOT_NULL` is supported for all
692 datatypes, including lists and maps. This operator tests for the
693 existence of an attribute, not its data type. If the data type of
694 attribute " `a`" is null, and you evaluate it using `NOT_NULL`, the
695 result is a Boolean true . This result is because the attribute "
696 `a`" exists; its data type is not relevant to the `NOT_NULL`
697 comparison operator.
698 + `NULL` : The attribute does not exist. `NULL` is supported for all
699 datatypes, including lists and maps. This operator tests for the
700 nonexistence of an attribute, not its data type. If the data type
701 of attribute " `a`" is null, and you evaluate it using `NULL`, the
702 result is a Boolean false . This is because the attribute " `a`"
703 exists; its data type is not relevant to the `NULL` comparison
704 operator.
705 + `CONTAINS` : Checks for a subsequence, or value in a set.
706 AttributeValueList can contain only one AttributeValue element of
707 type String, Number, or Binary (not a set type). If the target
708 attribute of the comparison is of type String, then the operator
709 checks for a substring match. If the target attribute of the
710 comparison is of type Binary, then the operator looks for a
711 subsequence of the target that matches the input. If the target
712 attribute of the comparison is a set (" `SS`", " `NS`", or "
713 `BS`"), then the operator evaluates to true if it finds an exact
714 match with any member of the set. CONTAINS is supported for lists:
715 When evaluating " `a CONTAINS b`", " `a`" can be a list; however, "
716 `b`" cannot be a set, a map, or a list.
717 + `NOT_CONTAINS` : Checks for absence of a subsequence, or absence of a
718 value in a set. AttributeValueList can contain only one
719 AttributeValue element of type String, Number, or Binary (not a set
720 type). If the target attribute of the comparison is a String, then
721 the operator checks for the absence of a substring match. If the
722 target attribute of the comparison is Binary, then the operator
723 checks for the absence of a subsequence of the target that matches
724 the input. If the target attribute of the comparison is a set ("
725 `SS`", " `NS`", or " `BS`"), then the operator evaluates to true if
726 it does not find an exact match with any member of the set.
727 NOT_CONTAINS is supported for lists: When evaluating " `a NOT
728 CONTAINS b`", " `a`" can be a list; however, " `b`" cannot be a
729 set, a map, or a list.
730 + `BEGINS_WITH` : Checks for a prefix. AttributeValueList can contain
731 only one AttributeValue of type String or Binary (not a Number or a
732 set type). The target attribute of the comparison must be of type
733 String or Binary (not a Number or a set type). > <li>
734 + `IN` : Checks for matching elements within two sets.
735 AttributeValueList can contain one or more AttributeValue elements
736 of type String, Number, or Binary (not a set type). These
737 attributes are compared against an existing set type attribute of
738 an item. If any elements of the input set are present in the item
739 attribute, the expression evaluates to true.
740 + `BETWEEN` : Greater than or equal to the first value, and less than
741 or equal to the second value. AttributeValueList must contain two
742 AttributeValue elements of the same type, either String, Number, or
743 Binary (not a set type). A target attribute matches if the target
744 value is greater than, or equal to, the first element and less
745 than, or equal to, the second element. If an item contains an
746 AttributeValue element of a different type than the one specified
747 in the request, the value does not match. For example, `{"S":"6"}`
748 does not compare to `{"N":"6"}`. Also, `{"N":"6"}` does not compare
749 to `{"NS":["6", "2", "1"]}`
750
751
752
753 For usage examples of AttributeValueList and ComparisonOperator , see
754 `Legacy Conditional Parameters`_ in the Amazon DynamoDB Developer
755 Guide .
756
757 For backward compatibility with previous DynamoDB releases, the
758 following parameters can be used instead of AttributeValueList and
759 ComparisonOperator :
760
761
762 + Value - A value for DynamoDB to compare with an attribute.
763 + Exists - A Boolean value that causes DynamoDB to evaluate the value
764 before attempting the conditional operation:
765
766 + If Exists is `True`, DynamoDB will check to see if that attribute
767 value already exists in the table. If it is found, then the
768 condition evaluates to true; otherwise the condition evaluate to
769 false.
770 + If Exists is `False`, DynamoDB assumes that the attribute value does
771 not exist in the table. If in fact the value does not exist, then
772 the assumption is valid and the condition evaluates to true. If the
773 value is found, despite the assumption that it does not exist, the
774 condition evaluates to false.
775 Note that the default value for Exists is `True`.
776
777
778 The Value and Exists parameters are incompatible with
779 AttributeValueList and ComparisonOperator . Note that if you use
780 both sets of parameters at once, DynamoDB will return a
781 ValidationException exception.
782
783 :type conditional_operator: string
784 :param conditional_operator:
785 There is a newer parameter available. Use ConditionExpression instead.
786 Note that if you use ConditionalOperator and ConditionExpression at
787 the same time, DynamoDB will return a ValidationException
788 exception.
789
790 This parameter does not support lists or maps.
791
792 A logical operator to apply to the conditions in the Expected map:
793
794
795 + `AND` - If all of the conditions evaluate to true, then the entire
796 map evaluates to true.
797 + `OR` - If at least one of the conditions evaluate to true, then the
798 entire map evaluates to true.
799
800
801 If you omit ConditionalOperator , then `AND` is the default.
802
803 The operation will succeed only if the entire map evaluates to true.
804
805 :type return_values: string
806 :param return_values:
807 Use ReturnValues if you want to get the item attributes as they
808 appeared before they were deleted. For DeleteItem , the valid
809 values are:
810
811
812 + `NONE` - If ReturnValues is not specified, or if its value is `NONE`,
813 then nothing is returned. (This setting is the default for
814 ReturnValues .)
815 + `ALL_OLD` - The content of the old item is returned.
816
817 :type return_consumed_capacity: string
818 :param return_consumed_capacity: A value that if set to `TOTAL`, the
819 response includes ConsumedCapacity data for tables and indexes. If
820 set to `INDEXES`, the response includes ConsumedCapacity for
821 indexes. If set to `NONE` (the default), ConsumedCapacity is not
822 included in the response.
823
824 :type return_item_collection_metrics: string
825 :param return_item_collection_metrics: A value that if set to `SIZE`,
826 the response includes statistics about item collections, if any,
827 that were modified during the operation are returned in the
828 response. If set to `NONE` (the default), no statistics are
829 returned.
830
831 :type condition_expression: string
832 :param condition_expression: A condition that must be satisfied in
833 order for a conditional DeleteItem to succeed.
834 An expression can contain any of the following:
835
836
837 + Boolean functions: `attribute_exists | attribute_not_exists |
838 contains | begins_with` These function names are case-sensitive.
839 + Comparison operators: ` = | <> | < | > | <=
840 | >= | BETWEEN | IN`
841 + Logical operators: `AND | OR | NOT`
842
843
844 For more information on condition expressions, go to `Specifying
845 Conditions`_ in the Amazon DynamoDB Developer Guide .
846
847 :type expression_attribute_names: map
848 :param expression_attribute_names: One or more substitution tokens for
849 simplifying complex expressions. The following are some use cases
850 for using ExpressionAttributeNames :
851
852 + To shorten an attribute name that is very long or unwieldy in an
853 expression.
854 + To create a placeholder for repeating occurrences of an attribute
855 name in an expression.
856 + To prevent special characters in an attribute name from being
857 misinterpreted in an expression.
858
859
860 Use the **#** character in an expression to dereference an attribute
861 name. For example, consider the following expression:
862
863
864 + `order.customerInfo.LastName = "Smith" OR order.customerInfo.LastName
865 = "Jones"`
866
867
868 Now suppose that you specified the following for
869 ExpressionAttributeNames :
870
871
872 + `{"#name":"order.customerInfo.LastName"}`
873
874
875 The expression can now be simplified as follows:
876
877
878 + `#name = "Smith" OR #name = "Jones"`
879
880
881 For more information on expression attribute names, go to `Accessing
882 Item Attributes`_ in the Amazon DynamoDB Developer Guide .
883
884 :type expression_attribute_values: map
885 :param expression_attribute_values: One or more values that can be
886 substituted in an expression.
887 Use the **:** (colon) character in an expression to dereference an
888 attribute value. For example, suppose that you wanted to check
889 whether the value of the ProductStatus attribute was one of the
890 following:
891
892 `Available | Backordered | Discontinued`
893
894 You would first need to specify ExpressionAttributeValues as follows:
895
896 `{ ":avail":{"S":"Available"}, ":back":{"S":"Backordered"},
897 ":disc":{"S":"Discontinued"} }`
898
899 You could then use these values in an expression, such as this:
900
901 `ProductStatus IN (:avail, :back, :disc)`
902
903 For more information on expression attribute values, go to `Specifying
904 Conditions`_ in the Amazon DynamoDB Developer Guide .
905
906 """
907 params = {'TableName': table_name, 'Key': key, }
908 if expected is not None:
909 params['Expected'] = expected
910 if conditional_operator is not None:
911 params['ConditionalOperator'] = conditional_operator
912 if return_values is not None:
913 params['ReturnValues'] = return_values
914 if return_consumed_capacity is not None:
915 params['ReturnConsumedCapacity'] = return_consumed_capacity
916 if return_item_collection_metrics is not None:
917 params['ReturnItemCollectionMetrics'] = return_item_collection_metrics
918 if condition_expression is not None:
919 params['ConditionExpression'] = condition_expression
920 if expression_attribute_names is not None:
921 params['ExpressionAttributeNames'] = expression_attribute_names
922 if expression_attribute_values is not None:
923 params['ExpressionAttributeValues'] = expression_attribute_values
924 return self.make_request(action='DeleteItem',
925 body=json.dumps(params))
926
927 def delete_table(self, table_name):
928 """
929 The DeleteTable operation deletes a table and all of its
930 items. After a DeleteTable request, the specified table is in
931 the `DELETING` state until DynamoDB completes the deletion. If
932 the table is in the `ACTIVE` state, you can delete it. If a
933 table is in `CREATING` or `UPDATING` states, then DynamoDB
934 returns a ResourceInUseException . If the specified table does
935 not exist, DynamoDB returns a ResourceNotFoundException . If
936 table is already in the `DELETING` state, no error is
937 returned.
938
939
940 DynamoDB might continue to accept data read and write
941 operations, such as GetItem and PutItem , on a table in the
942 `DELETING` state until the table deletion is complete.
943
944
945 When you delete a table, any indexes on that table are also
946 deleted.
947
948 Use the DescribeTable API to check the status of the table.
949
950 :type table_name: string
951 :param table_name: The name of the table to delete.
952
953 """
954 params = {'TableName': table_name, }
955 return self.make_request(action='DeleteTable',
956 body=json.dumps(params))
957
958 def describe_table(self, table_name):
959 """
960 Returns information about the table, including the current
961 status of the table, when it was created, the primary key
962 schema, and any indexes on the table.
963
964
965 If you issue a DescribeTable request immediately after a
966 CreateTable request, DynamoDB might return a
967 ResourceNotFoundException. This is because DescribeTable uses
968 an eventually consistent query, and the metadata for your
969 table might not be available at that moment. Wait for a few
970 seconds, and then try the DescribeTable request again.
971
972 :type table_name: string
973 :param table_name: The name of the table to describe.
974
975 """
976 params = {'TableName': table_name, }
977 return self.make_request(action='DescribeTable',
978 body=json.dumps(params))
979
980 def get_item(self, table_name, key, attributes_to_get=None,
981 consistent_read=None, return_consumed_capacity=None,
982 projection_expression=None, expression_attribute_names=None):
983 """
984 The GetItem operation returns a set of attributes for the item
985 with the given primary key. If there is no matching item,
986 GetItem does not return any data.
987
988 GetItem provides an eventually consistent read by default. If
989 your application requires a strongly consistent read, set
990 ConsistentRead to `True`. Although a strongly consistent read
991 might take more time than an eventually consistent read, it
992 always returns the last updated value.
993
994 :type table_name: string
995 :param table_name: The name of the table containing the requested item.
996
997 :type key: map
998 :param key: A map of attribute names to AttributeValue objects,
999 representing the primary key of the item to retrieve.
1000 For the primary key, you must provide all of the attributes. For
1001 example, with a hash type primary key, you only need to specify the
1002 hash attribute. For a hash-and-range type primary key, you must
1003 specify both the hash attribute and the range attribute.
1004
1005 :type attributes_to_get: list
1006 :param attributes_to_get:
1007 There is a newer parameter available. Use ProjectionExpression instead.
1008 Note that if you use AttributesToGet and ProjectionExpression at
1009 the same time, DynamoDB will return a ValidationException
1010 exception.
1011
1012 This parameter allows you to retrieve lists or maps; however, it cannot
1013 retrieve individual list or map elements.
1014
1015 The names of one or more attributes to retrieve. If no attribute names
1016 are specified, then all attributes will be returned. If any of the
1017 requested attributes are not found, they will not appear in the
1018 result.
1019
1020 Note that AttributesToGet has no effect on provisioned throughput
1021 consumption. DynamoDB determines capacity units consumed based on
1022 item size, not on the amount of data that is returned to an
1023 application.
1024
1025 :type consistent_read: boolean
1026 :param consistent_read: A value that if set to `True`, then the
1027 operation uses strongly consistent reads; otherwise, eventually
1028 consistent reads are used.
1029
1030 :type return_consumed_capacity: string
1031 :param return_consumed_capacity: A value that if set to `TOTAL`, the
1032 response includes ConsumedCapacity data for tables and indexes. If
1033 set to `INDEXES`, the response includes ConsumedCapacity for
1034 indexes. If set to `NONE` (the default), ConsumedCapacity is not
1035 included in the response.
1036
1037 :type projection_expression: string
1038 :param projection_expression: A string that identifies one or more
1039 attributes to retrieve from the table. These attributes can include
1040 scalars, sets, or elements of a JSON document. The attributes in
1041 the expression must be separated by commas.
1042 If no attribute names are specified, then all attributes will be
1043 returned. If any of the requested attributes are not found, they
1044 will not appear in the result.
1045
1046 For more information on projection expressions, go to `Accessing Item
1047 Attributes`_ in the Amazon DynamoDB Developer Guide .
1048
1049 :type expression_attribute_names: map
1050 :param expression_attribute_names: One or more substitution tokens for
1051 simplifying complex expressions. The following are some use cases
1052 for using ExpressionAttributeNames :
1053
1054 + To shorten an attribute name that is very long or unwieldy in an
1055 expression.
1056 + To create a placeholder for repeating occurrences of an attribute
1057 name in an expression.
1058 + To prevent special characters in an attribute name from being
1059 misinterpreted in an expression.
1060
1061
1062 Use the **#** character in an expression to dereference an attribute
1063 name. For example, consider the following expression:
1064
1065
1066 + `order.customerInfo.LastName = "Smith" OR order.customerInfo.LastName
1067 = "Jones"`
1068
1069
1070 Now suppose that you specified the following for
1071 ExpressionAttributeNames :
1072
1073
1074 + `{"#name":"order.customerInfo.LastName"}`
1075
1076
1077 The expression can now be simplified as follows:
1078
1079
1080 + `#name = "Smith" OR #name = "Jones"`
1081
1082
1083 For more information on expression attribute names, go to `Accessing
1084 Item Attributes`_ in the Amazon DynamoDB Developer Guide .
1085
1086 """
1087 params = {'TableName': table_name, 'Key': key, }
1088 if attributes_to_get is not None:
1089 params['AttributesToGet'] = attributes_to_get
1090 if consistent_read is not None:
1091 params['ConsistentRead'] = consistent_read
1092 if return_consumed_capacity is not None:
1093 params['ReturnConsumedCapacity'] = return_consumed_capacity
1094 if projection_expression is not None:
1095 params['ProjectionExpression'] = projection_expression
1096 if expression_attribute_names is not None:
1097 params['ExpressionAttributeNames'] = expression_attribute_names
1098 return self.make_request(action='GetItem',
1099 body=json.dumps(params))
1100
1101 def list_tables(self, exclusive_start_table_name=None, limit=None):
1102 """
1103 Returns an array of table names associated with the current
1104 account and endpoint. The output from ListTables is paginated,
1105 with each page returning a maximum of 100 table names.
1106
1107 :type exclusive_start_table_name: string
1108 :param exclusive_start_table_name: The first table name that this
1109 operation will evaluate. Use the value that was returned for
1110 LastEvaluatedTableName in a previous operation, so that you can
1111 obtain the next page of results.
1112
1113 :type limit: integer
1114 :param limit: A maximum number of table names to return. If this
1115 parameter is not specified, the limit is 100.
1116
1117 """
1118 params = {}
1119 if exclusive_start_table_name is not None:
1120 params['ExclusiveStartTableName'] = exclusive_start_table_name
1121 if limit is not None:
1122 params['Limit'] = limit
1123 return self.make_request(action='ListTables',
1124 body=json.dumps(params))
1125
1126 def put_item(self, table_name, item, expected=None, return_values=None,
1127 return_consumed_capacity=None,
1128 return_item_collection_metrics=None,
1129 conditional_operator=None, condition_expression=None,
1130 expression_attribute_names=None,
1131 expression_attribute_values=None):
1132 """
1133 Creates a new item, or replaces an old item with a new item.
1134 If an item that has the same primary key as the new item
1135 already exists in the specified table, the new item completely
1136 replaces the existing item. You can perform a conditional put
1137 operation (add a new item if one with the specified primary
1138 key doesn't exist), or replace an existing item if it has
1139 certain attribute values.
1140
1141 In addition to putting an item, you can also return the item's
1142 attribute values in the same operation, using the ReturnValues
1143 parameter.
1144
1145 When you add an item, the primary key attribute(s) are the
1146 only required attributes. Attribute values cannot be null.
1147 String and Binary type attributes must have lengths greater
1148 than zero. Set type attributes cannot be empty. Requests with
1149 empty values will be rejected with a ValidationException
1150 exception.
1151
1152 You can request that PutItem return either a copy of the
1153 original item (before the update) or a copy of the updated
1154 item (after the update). For more information, see the
1155 ReturnValues description below.
1156
1157
1158 To prevent a new item from replacing an existing item, use a
1159 conditional put operation with ComparisonOperator set to
1160 `NULL` for the primary key attribute, or attributes.
1161
1162
1163 For more information about using this API, see `Working with
1164 Items`_ in the Amazon DynamoDB Developer Guide .
1165
1166 :type table_name: string
1167 :param table_name: The name of the table to contain the item.
1168
1169 :type item: map
1170 :param item: A map of attribute name/value pairs, one for each
1171 attribute. Only the primary key attributes are required; you can
1172 optionally provide other attribute name-value pairs for the item.
1173 You must provide all of the attributes for the primary key. For
1174 example, with a hash type primary key, you only need to specify the
1175 hash attribute. For a hash-and-range type primary key, you must
1176 specify both the hash attribute and the range attribute.
1177
1178 If you specify any attributes that are part of an index key, then the
1179 data types for those attributes must match those of the schema in
1180 the table's attribute definition.
1181
1182 For more information about primary keys, see `Primary Key`_ in the
1183 Amazon DynamoDB Developer Guide .
1184
1185 Each element in the Item map is an AttributeValue object.
1186
1187 :type expected: map
1188 :param expected:
1189 There is a newer parameter available. Use ConditionExpression instead.
1190 Note that if you use Expected and ConditionExpression at the same
1191 time, DynamoDB will return a ValidationException exception.
1192
1193 This parameter does not support lists or maps.
1194
1195 A map of attribute/condition pairs. Expected provides a conditional
1196 block for the PutItem operation.
1197
1198 Each element of Expected consists of an attribute name, a comparison
1199 operator, and one or more values. DynamoDB compares the attribute
1200 with the value(s) you supplied, using the comparison operator. For
1201 each Expected element, the result of the evaluation is either true
1202 or false.
1203
1204 If you specify more than one element in the Expected map, then by
1205 default all of the conditions must evaluate to true. In other
1206 words, the conditions are ANDed together. (You can use the
1207 ConditionalOperator parameter to OR the conditions instead. If you
1208 do this, then at least one of the conditions must evaluate to true,
1209 rather than all of them.)
1210
1211 If the Expected map evaluates to true, then the conditional operation
1212 succeeds; otherwise, it fails.
1213
1214 Expected contains the following:
1215
1216
1217 + AttributeValueList - One or more values to evaluate against the
1218 supplied attribute. The number of values in the list depends on the
1219 ComparisonOperator being used. For type Number, value comparisons
1220 are numeric. String value comparisons for greater than, equals, or
1221 less than are based on ASCII character code values. For example,
1222 `a` is greater than `A`, and `a` is greater than `B`. For a list of
1223 code values, see
1224 `http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters`_.
1225 For type Binary, DynamoDB treats each byte of the binary data as
1226 unsigned when it compares binary values, for example when
1227 evaluating query expressions.
1228 + ComparisonOperator - A comparator for evaluating attributes in the
1229 AttributeValueList . When performing the comparison, DynamoDB uses
1230 strongly consistent reads. The following comparison operators are
1231 available: `EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL |
1232 CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN` The following
1233 are descriptions of each comparison operator.
1234
1235 + `EQ` : Equal. `EQ` is supported for all datatypes, including lists
1236 and maps. AttributeValueList can contain only one AttributeValue
1237 element of type String, Number, Binary, String Set, Number Set, or
1238 Binary Set. If an item contains an AttributeValue element of a
1239 different type than the one specified in the request, the value
1240 does not match. For example, `{"S":"6"}` does not equal
1241 `{"N":"6"}`. Also, `{"N":"6"}` does not equal `{"NS":["6", "2",
1242 "1"]}`. > <li>
1243 + `NE` : Not equal. `NE` is supported for all datatypes, including
1244 lists and maps. AttributeValueList can contain only one
1245 AttributeValue of type String, Number, Binary, String Set, Number
1246 Set, or Binary Set. If an item contains an AttributeValue of a
1247 different type than the one specified in the request, the value
1248 does not match. For example, `{"S":"6"}` does not equal
1249 `{"N":"6"}`. Also, `{"N":"6"}` does not equal `{"NS":["6", "2",
1250 "1"]}`. > <li>
1251 + `LE` : Less than or equal. AttributeValueList can contain only one
1252 AttributeValue element of type String, Number, or Binary (not a set
1253 type). If an item contains an AttributeValue element of a different
1254 type than the one specified in the request, the value does not
1255 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1256 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1257 + `LT` : Less than. AttributeValueList can contain only one
1258 AttributeValue of type String, Number, or Binary (not a set type).
1259 If an item contains an AttributeValue element of a different type
1260 than the one specified in the request, the value does not match.
1261 For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1262 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1263 + `GE` : Greater than or equal. AttributeValueList can contain only one
1264 AttributeValue element of type String, Number, or Binary (not a set
1265 type). If an item contains an AttributeValue element of a different
1266 type than the one specified in the request, the value does not
1267 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1268 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1269 + `GT` : Greater than. AttributeValueList can contain only one
1270 AttributeValue element of type String, Number, or Binary (not a set
1271 type). If an item contains an AttributeValue element of a different
1272 type than the one specified in the request, the value does not
1273 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1274 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1275 + `NOT_NULL` : The attribute exists. `NOT_NULL` is supported for all
1276 datatypes, including lists and maps. This operator tests for the
1277 existence of an attribute, not its data type. If the data type of
1278 attribute " `a`" is null, and you evaluate it using `NOT_NULL`, the
1279 result is a Boolean true . This result is because the attribute "
1280 `a`" exists; its data type is not relevant to the `NOT_NULL`
1281 comparison operator.
1282 + `NULL` : The attribute does not exist. `NULL` is supported for all
1283 datatypes, including lists and maps. This operator tests for the
1284 nonexistence of an attribute, not its data type. If the data type
1285 of attribute " `a`" is null, and you evaluate it using `NULL`, the
1286 result is a Boolean false . This is because the attribute " `a`"
1287 exists; its data type is not relevant to the `NULL` comparison
1288 operator.
1289 + `CONTAINS` : Checks for a subsequence, or value in a set.
1290 AttributeValueList can contain only one AttributeValue element of
1291 type String, Number, or Binary (not a set type). If the target
1292 attribute of the comparison is of type String, then the operator
1293 checks for a substring match. If the target attribute of the
1294 comparison is of type Binary, then the operator looks for a
1295 subsequence of the target that matches the input. If the target
1296 attribute of the comparison is a set (" `SS`", " `NS`", or "
1297 `BS`"), then the operator evaluates to true if it finds an exact
1298 match with any member of the set. CONTAINS is supported for lists:
1299 When evaluating " `a CONTAINS b`", " `a`" can be a list; however, "
1300 `b`" cannot be a set, a map, or a list.
1301 + `NOT_CONTAINS` : Checks for absence of a subsequence, or absence of a
1302 value in a set. AttributeValueList can contain only one
1303 AttributeValue element of type String, Number, or Binary (not a set
1304 type). If the target attribute of the comparison is a String, then
1305 the operator checks for the absence of a substring match. If the
1306 target attribute of the comparison is Binary, then the operator
1307 checks for the absence of a subsequence of the target that matches
1308 the input. If the target attribute of the comparison is a set ("
1309 `SS`", " `NS`", or " `BS`"), then the operator evaluates to true if
1310 it does not find an exact match with any member of the set.
1311 NOT_CONTAINS is supported for lists: When evaluating " `a NOT
1312 CONTAINS b`", " `a`" can be a list; however, " `b`" cannot be a
1313 set, a map, or a list.
1314 + `BEGINS_WITH` : Checks for a prefix. AttributeValueList can contain
1315 only one AttributeValue of type String or Binary (not a Number or a
1316 set type). The target attribute of the comparison must be of type
1317 String or Binary (not a Number or a set type). > <li>
1318 + `IN` : Checks for matching elements within two sets.
1319 AttributeValueList can contain one or more AttributeValue elements
1320 of type String, Number, or Binary (not a set type). These
1321 attributes are compared against an existing set type attribute of
1322 an item. If any elements of the input set are present in the item
1323 attribute, the expression evaluates to true.
1324 + `BETWEEN` : Greater than or equal to the first value, and less than
1325 or equal to the second value. AttributeValueList must contain two
1326 AttributeValue elements of the same type, either String, Number, or
1327 Binary (not a set type). A target attribute matches if the target
1328 value is greater than, or equal to, the first element and less
1329 than, or equal to, the second element. If an item contains an
1330 AttributeValue element of a different type than the one specified
1331 in the request, the value does not match. For example, `{"S":"6"}`
1332 does not compare to `{"N":"6"}`. Also, `{"N":"6"}` does not compare
1333 to `{"NS":["6", "2", "1"]}`
1334
1335
1336
1337 For usage examples of AttributeValueList and ComparisonOperator , see
1338 `Legacy Conditional Parameters`_ in the Amazon DynamoDB Developer
1339 Guide .
1340
1341 For backward compatibility with previous DynamoDB releases, the
1342 following parameters can be used instead of AttributeValueList and
1343 ComparisonOperator :
1344
1345
1346 + Value - A value for DynamoDB to compare with an attribute.
1347 + Exists - A Boolean value that causes DynamoDB to evaluate the value
1348 before attempting the conditional operation:
1349
1350 + If Exists is `True`, DynamoDB will check to see if that attribute
1351 value already exists in the table. If it is found, then the
1352 condition evaluates to true; otherwise the condition evaluate to
1353 false.
1354 + If Exists is `False`, DynamoDB assumes that the attribute value does
1355 not exist in the table. If in fact the value does not exist, then
1356 the assumption is valid and the condition evaluates to true. If the
1357 value is found, despite the assumption that it does not exist, the
1358 condition evaluates to false.
1359 Note that the default value for Exists is `True`.
1360
1361
1362 The Value and Exists parameters are incompatible with
1363 AttributeValueList and ComparisonOperator . Note that if you use
1364 both sets of parameters at once, DynamoDB will return a
1365 ValidationException exception.
1366
1367 :type return_values: string
1368 :param return_values:
1369 Use ReturnValues if you want to get the item attributes as they
1370 appeared before they were updated with the PutItem request. For
1371 PutItem , the valid values are:
1372
1373
1374 + `NONE` - If ReturnValues is not specified, or if its value is `NONE`,
1375 then nothing is returned. (This setting is the default for
1376 ReturnValues .)
1377 + `ALL_OLD` - If PutItem overwrote an attribute name-value pair, then
1378 the content of the old item is returned.
1379
1380 :type return_consumed_capacity: string
1381 :param return_consumed_capacity: A value that if set to `TOTAL`, the
1382 response includes ConsumedCapacity data for tables and indexes. If
1383 set to `INDEXES`, the response includes ConsumedCapacity for
1384 indexes. If set to `NONE` (the default), ConsumedCapacity is not
1385 included in the response.
1386
1387 :type return_item_collection_metrics: string
1388 :param return_item_collection_metrics: A value that if set to `SIZE`,
1389 the response includes statistics about item collections, if any,
1390 that were modified during the operation are returned in the
1391 response. If set to `NONE` (the default), no statistics are
1392 returned.
1393
1394 :type conditional_operator: string
1395 :param conditional_operator:
1396 There is a newer parameter available. Use ConditionExpression instead.
1397 Note that if you use ConditionalOperator and ConditionExpression at
1398 the same time, DynamoDB will return a ValidationException
1399 exception.
1400
1401 This parameter does not support lists or maps.
1402
1403 A logical operator to apply to the conditions in the Expected map:
1404
1405
1406 + `AND` - If all of the conditions evaluate to true, then the entire
1407 map evaluates to true.
1408 + `OR` - If at least one of the conditions evaluate to true, then the
1409 entire map evaluates to true.
1410
1411
1412 If you omit ConditionalOperator , then `AND` is the default.
1413
1414 The operation will succeed only if the entire map evaluates to true.
1415
1416 :type condition_expression: string
1417 :param condition_expression: A condition that must be satisfied in
1418 order for a conditional PutItem operation to succeed.
1419 An expression can contain any of the following:
1420
1421
1422 + Boolean functions: `attribute_exists | attribute_not_exists |
1423 contains | begins_with` These function names are case-sensitive.
1424 + Comparison operators: ` = | <> | < | > | <=
1425 | >= | BETWEEN | IN`
1426 + Logical operators: `AND | OR | NOT`
1427
1428
1429 For more information on condition expressions, go to `Specifying
1430 Conditions`_ in the Amazon DynamoDB Developer Guide .
1431
1432 :type expression_attribute_names: map
1433 :param expression_attribute_names: One or more substitution tokens for
1434 simplifying complex expressions. The following are some use cases
1435 for using ExpressionAttributeNames :
1436
1437 + To shorten an attribute name that is very long or unwieldy in an
1438 expression.
1439 + To create a placeholder for repeating occurrences of an attribute
1440 name in an expression.
1441 + To prevent special characters in an attribute name from being
1442 misinterpreted in an expression.
1443
1444
1445 Use the **#** character in an expression to dereference an attribute
1446 name. For example, consider the following expression:
1447
1448
1449 + `order.customerInfo.LastName = "Smith" OR order.customerInfo.LastName
1450 = "Jones"`
1451
1452
1453 Now suppose that you specified the following for
1454 ExpressionAttributeNames :
1455
1456
1457 + `{"#name":"order.customerInfo.LastName"}`
1458
1459
1460 The expression can now be simplified as follows:
1461
1462
1463 + `#name = "Smith" OR #name = "Jones"`
1464
1465
1466 For more information on expression attribute names, go to `Accessing
1467 Item Attributes`_ in the Amazon DynamoDB Developer Guide .
1468
1469 :type expression_attribute_values: map
1470 :param expression_attribute_values: One or more values that can be
1471 substituted in an expression.
1472 Use the **:** (colon) character in an expression to dereference an
1473 attribute value. For example, suppose that you wanted to check
1474 whether the value of the ProductStatus attribute was one of the
1475 following:
1476
1477 `Available | Backordered | Discontinued`
1478
1479 You would first need to specify ExpressionAttributeValues as follows:
1480
1481 `{ ":avail":{"S":"Available"}, ":back":{"S":"Backordered"},
1482 ":disc":{"S":"Discontinued"} }`
1483
1484 You could then use these values in an expression, such as this:
1485
1486 `ProductStatus IN (:avail, :back, :disc)`
1487
1488 For more information on expression attribute values, go to `Specifying
1489 Conditions`_ in the Amazon DynamoDB Developer Guide .
1490
1491 """
1492 params = {'TableName': table_name, 'Item': item, }
1493 if expected is not None:
1494 params['Expected'] = expected
1495 if return_values is not None:
1496 params['ReturnValues'] = return_values
1497 if return_consumed_capacity is not None:
1498 params['ReturnConsumedCapacity'] = return_consumed_capacity
1499 if return_item_collection_metrics is not None:
1500 params['ReturnItemCollectionMetrics'] = return_item_collection_metrics
1501 if conditional_operator is not None:
1502 params['ConditionalOperator'] = conditional_operator
1503 if condition_expression is not None:
1504 params['ConditionExpression'] = condition_expression
1505 if expression_attribute_names is not None:
1506 params['ExpressionAttributeNames'] = expression_attribute_names
1507 if expression_attribute_values is not None:
1508 params['ExpressionAttributeValues'] = expression_attribute_values
1509 return self.make_request(action='PutItem',
1510 body=json.dumps(params))
1511
1512 def query(self, table_name, key_conditions, index_name=None, select=None,
1513 attributes_to_get=None, limit=None, consistent_read=None,
1514 query_filter=None, conditional_operator=None,
1515 scan_index_forward=None, exclusive_start_key=None,
1516 return_consumed_capacity=None, projection_expression=None,
1517 filter_expression=None, expression_attribute_names=None,
1518 expression_attribute_values=None):
1519 """
1520 A Query operation directly accesses items from a table using
1521 the table primary key, or from an index using the index key.
1522 You must provide a specific hash key value. You can narrow the
1523 scope of the query by using comparison operators on the range
1524 key value, or on the index key. You can use the
1525 ScanIndexForward parameter to get results in forward or
1526 reverse order, by range key or by index key.
1527
1528 Queries that do not return results consume the minimum number
1529 of read capacity units for that type of read operation.
1530
1531 If the total number of items meeting the query criteria
1532 exceeds the result set size limit of 1 MB, the query stops and
1533 results are returned to the user with LastEvaluatedKey to
1534 continue the query in a subsequent operation. Unlike a Scan
1535 operation, a Query operation never returns both an empty
1536 result set and a LastEvaluatedKey . The LastEvaluatedKey is
1537 only provided if the results exceed 1 MB, or if you have used
1538 Limit .
1539
1540 You can query a table, a local secondary index, or a global
1541 secondary index. For a query on a table or on a local
1542 secondary index, you can set ConsistentRead to true and obtain
1543 a strongly consistent result. Global secondary indexes support
1544 eventually consistent reads only, so do not specify
1545 ConsistentRead when querying a global secondary index.
1546
1547 :type table_name: string
1548 :param table_name: The name of the table containing the requested
1549 items.
1550
1551 :type index_name: string
1552 :param index_name: The name of an index to query. This index can be any
1553 local secondary index or global secondary index on the table.
1554
1555 :type select: string
1556 :param select: The attributes to be returned in the result. You can
1557 retrieve all item attributes, specific item attributes, the count
1558 of matching items, or in the case of an index, some or all of the
1559 attributes projected into the index.
1560
1561 + `ALL_ATTRIBUTES` - Returns all of the item attributes from the
1562 specified table or index. If you query a local secondary index,
1563 then for each matching item in the index DynamoDB will fetch the
1564 entire item from the parent table. If the index is configured to
1565 project all item attributes, then all of the data can be obtained
1566 from the local secondary index, and no fetching is required.
1567 + `ALL_PROJECTED_ATTRIBUTES` - Allowed only when querying an index.
1568 Retrieves all attributes that have been projected into the index.
1569 If the index is configured to project all attributes, this return
1570 value is equivalent to specifying `ALL_ATTRIBUTES`.
1571 + `COUNT` - Returns the number of matching items, rather than the
1572 matching items themselves.
1573 + `SPECIFIC_ATTRIBUTES` - Returns only the attributes listed in
1574 AttributesToGet . This return value is equivalent to specifying
1575 AttributesToGet without specifying any value for Select . If you
1576 query a local secondary index and request only attributes that are
1577 projected into that index, the operation will read only the index
1578 and not the table. If any of the requested attributes are not
1579 projected into the local secondary index, DynamoDB will fetch each
1580 of these attributes from the parent table. This extra fetching
1581 incurs additional throughput cost and latency. If you query a
1582 global secondary index, you can only request attributes that are
1583 projected into the index. Global secondary index queries cannot
1584 fetch attributes from the parent table.
1585
1586
1587 If neither Select nor AttributesToGet are specified, DynamoDB defaults
1588 to `ALL_ATTRIBUTES` when accessing a table, and
1589 `ALL_PROJECTED_ATTRIBUTES` when accessing an index. You cannot use
1590 both Select and AttributesToGet together in a single request,
1591 unless the value for Select is `SPECIFIC_ATTRIBUTES`. (This usage
1592 is equivalent to specifying AttributesToGet without any value for
1593 Select .)
1594
1595 :type attributes_to_get: list
1596 :param attributes_to_get:
1597 There is a newer parameter available. Use ProjectionExpression instead.
1598 Note that if you use AttributesToGet and ProjectionExpression at
1599 the same time, DynamoDB will return a ValidationException
1600 exception.
1601
1602 This parameter allows you to retrieve lists or maps; however, it cannot
1603 retrieve individual list or map elements.
1604
1605 The names of one or more attributes to retrieve. If no attribute names
1606 are specified, then all attributes will be returned. If any of the
1607 requested attributes are not found, they will not appear in the
1608 result.
1609
1610 Note that AttributesToGet has no effect on provisioned throughput
1611 consumption. DynamoDB determines capacity units consumed based on
1612 item size, not on the amount of data that is returned to an
1613 application.
1614
1615 You cannot use both AttributesToGet and Select together in a Query
1616 request, unless the value for Select is `SPECIFIC_ATTRIBUTES`.
1617 (This usage is equivalent to specifying AttributesToGet without any
1618 value for Select .)
1619
1620 If you query a local secondary index and request only attributes that
1621 are projected into that index, the operation will read only the
1622 index and not the table. If any of the requested attributes are not
1623 projected into the local secondary index, DynamoDB will fetch each
1624 of these attributes from the parent table. This extra fetching
1625 incurs additional throughput cost and latency.
1626
1627 If you query a global secondary index, you can only request attributes
1628 that are projected into the index. Global secondary index queries
1629 cannot fetch attributes from the parent table.
1630
1631 :type limit: integer
1632 :param limit: The maximum number of items to evaluate (not necessarily
1633 the number of matching items). If DynamoDB processes the number of
1634 items up to the limit while processing the results, it stops the
1635 operation and returns the matching values up to that point, and a
1636 key in LastEvaluatedKey to apply in a subsequent operation, so that
1637 you can pick up where you left off. Also, if the processed data set
1638 size exceeds 1 MB before DynamoDB reaches this limit, it stops the
1639 operation and returns the matching values up to the limit, and a
1640 key in LastEvaluatedKey to apply in a subsequent operation to
1641 continue the operation. For more information, see `Query and Scan`_
1642 in the Amazon DynamoDB Developer Guide .
1643
1644 :type consistent_read: boolean
1645 :param consistent_read: A value that if set to `True`, then the
1646 operation uses strongly consistent reads; otherwise, eventually
1647 consistent reads are used.
1648 Strongly consistent reads are not supported on global secondary
1649 indexes. If you query a global secondary index with ConsistentRead
1650 set to `True`, you will receive an error message.
1651
1652 :type key_conditions: map
1653 :param key_conditions: The selection criteria for the query. For a
1654 query on a table, you can have conditions only on the table primary
1655 key attributes. You must specify the hash key attribute name and
1656 value as an `EQ` condition. You can optionally specify a second
1657 condition, referring to the range key attribute. If you do not
1658 specify a range key condition, all items under the hash key will be
1659 fetched and processed. Any filters will applied after this.
1660 For a query on an index, you can have conditions only on the index key
1661 attributes. You must specify the index hash attribute name and
1662 value as an EQ condition. You can optionally specify a second
1663 condition, referring to the index key range attribute.
1664
1665 Each KeyConditions element consists of an attribute name to compare,
1666 along with the following:
1667
1668
1669 + AttributeValueList - One or more values to evaluate against the
1670 supplied attribute. The number of values in the list depends on the
1671 ComparisonOperator being used. For type Number, value comparisons
1672 are numeric. String value comparisons for greater than, equals, or
1673 less than are based on ASCII character code values. For example,
1674 `a` is greater than `A`, and `a` is greater than `B`. For a list of
1675 code values, see
1676 `http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters`_.
1677 For Binary, DynamoDB treats each byte of the binary data as
1678 unsigned when it compares binary values, for example when
1679 evaluating query expressions.
1680 + ComparisonOperator - A comparator for evaluating attributes, for
1681 example, equals, greater than, less than, and so on. For
1682 KeyConditions , only the following comparison operators are
1683 supported: `EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN` The
1684 following are descriptions of these comparison operators.
1685
1686 + `EQ` : Equal. AttributeValueList can contain only one AttributeValue
1687 of type String, Number, or Binary (not a set type). If an item
1688 contains an AttributeValue element of a different type than the one
1689 specified in the request, the value does not match. For example,
1690 `{"S":"6"}` does not equal `{"N":"6"}`. Also, `{"N":"6"}` does not
1691 equal `{"NS":["6", "2", "1"]}`.
1692 + `LE` : Less than or equal. AttributeValueList can contain only one
1693 AttributeValue element of type String, Number, or Binary (not a set
1694 type). If an item contains an AttributeValue element of a different
1695 type than the one specified in the request, the value does not
1696 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1697 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1698 + `LT` : Less than. AttributeValueList can contain only one
1699 AttributeValue of type String, Number, or Binary (not a set type).
1700 If an item contains an AttributeValue element of a different type
1701 than the one specified in the request, the value does not match.
1702 For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1703 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1704 + `GE` : Greater than or equal. AttributeValueList can contain only one
1705 AttributeValue element of type String, Number, or Binary (not a set
1706 type). If an item contains an AttributeValue element of a different
1707 type than the one specified in the request, the value does not
1708 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1709 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1710 + `GT` : Greater than. AttributeValueList can contain only one
1711 AttributeValue element of type String, Number, or Binary (not a set
1712 type). If an item contains an AttributeValue element of a different
1713 type than the one specified in the request, the value does not
1714 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
1715 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
1716 + `BEGINS_WITH` : Checks for a prefix. AttributeValueList can contain
1717 only one AttributeValue of type String or Binary (not a Number or a
1718 set type). The target attribute of the comparison must be of type
1719 String or Binary (not a Number or a set type). > <li>
1720 + `BETWEEN` : Greater than or equal to the first value, and less than
1721 or equal to the second value. AttributeValueList must contain two
1722 AttributeValue elements of the same type, either String, Number, or
1723 Binary (not a set type). A target attribute matches if the target
1724 value is greater than, or equal to, the first element and less
1725 than, or equal to, the second element. If an item contains an
1726 AttributeValue element of a different type than the one specified
1727 in the request, the value does not match. For example, `{"S":"6"}`
1728 does not compare to `{"N":"6"}`. Also, `{"N":"6"}` does not compare
1729 to `{"NS":["6", "2", "1"]}`
1730
1731
1732
1733 For usage examples of AttributeValueList and ComparisonOperator , see
1734 `Legacy Conditional Parameters`_ in the Amazon DynamoDB Developer
1735 Guide .
1736
1737 :type query_filter: map
1738 :param query_filter:
1739 There is a newer parameter available. Use FilterExpression instead.
1740 Note that if you use QueryFilter and FilterExpression at the same
1741 time, DynamoDB will return a ValidationException exception.
1742
1743 This parameter does not support lists or maps.
1744
1745 A condition that evaluates the query results after the items are read
1746 and returns only the desired values.
1747 Query filters are applied after the items are read, so they do not
1748 limit the capacity used.
1749 If you specify more than one condition in the QueryFilter map, then by
1750 default all of the conditions must evaluate to true. In other
1751 words, the conditions are ANDed together. (You can use the
1752 ConditionalOperator parameter to OR the conditions instead. If you
1753 do this, then at least one of the conditions must evaluate to true,
1754 rather than all of them.)
1755
1756
1757 QueryFilter does not allow key attributes. You cannot define a filter
1758 condition on a hash key or range key.
1759
1760
1761 Each QueryFilter element consists of an attribute name to compare,
1762 along with the following:
1763
1764
1765 + AttributeValueList - One or more values to evaluate against the
1766 supplied attribute. The number of values in the list depends on the
1767 operator specified in ComparisonOperator . For type Number, value
1768 comparisons are numeric. String value comparisons for greater than,
1769 equals, or less than are based on ASCII character code values. For
1770 example, `a` is greater than `A`, and `a` is greater than `B`. For
1771 a list of code values, see
1772 `http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters`_.
1773 For type Binary, DynamoDB treats each byte of the binary data as
1774 unsigned when it compares binary values, for example when
1775 evaluating query expressions. For information on specifying data
1776 types in JSON, see `JSON Data Format`_ in the Amazon DynamoDB
1777 Developer Guide .
1778 + ComparisonOperator - A comparator for evaluating attributes. For
1779 example, equals, greater than, less than, etc. The following
1780 comparison operators are available: `EQ | NE | LE | LT | GE | GT |
1781 NOT_NULL | NULL | CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN |
1782 BETWEEN` For complete descriptions of all comparison operators, see
1783 `API_Condition.html`_.
1784
1785 :type conditional_operator: string
1786 :param conditional_operator:
1787 This parameter does not support lists or maps.
1788
1789 A logical operator to apply to the conditions in the QueryFilter map:
1790
1791
1792 + `AND` - If all of the conditions evaluate to true, then the entire
1793 map evaluates to true.
1794 + `OR` - If at least one of the conditions evaluate to true, then the
1795 entire map evaluates to true.
1796
1797
1798 If you omit ConditionalOperator , then `AND` is the default.
1799
1800 The operation will succeed only if the entire map evaluates to true.
1801
1802 :type scan_index_forward: boolean
1803 :param scan_index_forward: A value that specifies ascending (true) or
1804 descending (false) traversal of the index. DynamoDB returns results
1805 reflecting the requested order determined by the range key. If the
1806 data type is Number, the results are returned in numeric order. For
1807 type String, the results are returned in order of ASCII character
1808 code values. For type Binary, DynamoDB treats each byte of the
1809 binary data as unsigned when it compares binary values.
1810 If ScanIndexForward is not specified, the results are returned in
1811 ascending order.
1812
1813 :type exclusive_start_key: map
1814 :param exclusive_start_key: The primary key of the first item that this
1815 operation will evaluate. Use the value that was returned for
1816 LastEvaluatedKey in the previous operation.
1817 The data type for ExclusiveStartKey must be String, Number or Binary.
1818 No set data types are allowed.
1819
1820 :type return_consumed_capacity: string
1821 :param return_consumed_capacity: A value that if set to `TOTAL`, the
1822 response includes ConsumedCapacity data for tables and indexes. If
1823 set to `INDEXES`, the response includes ConsumedCapacity for
1824 indexes. If set to `NONE` (the default), ConsumedCapacity is not
1825 included in the response.
1826
1827 :type projection_expression: string
1828 :param projection_expression: A string that identifies one or more
1829 attributes to retrieve from the table. These attributes can include
1830 scalars, sets, or elements of a JSON document. The attributes in
1831 the expression must be separated by commas.
1832 If no attribute names are specified, then all attributes will be
1833 returned. If any of the requested attributes are not found, they
1834 will not appear in the result.
1835
1836 For more information on projection expressions, go to `Accessing Item
1837 Attributes`_ in the Amazon DynamoDB Developer Guide .
1838
1839 :type filter_expression: string
1840 :param filter_expression: A condition that evaluates the query results
1841 after the items are read and returns only the desired values.
1842 The condition you specify is applied to the items queried; any items
1843 that do not match the expression are not returned.
1844 Filter expressions are applied after the items are read, so they do not
1845 limit the capacity used.
1846 A FilterExpression has the same syntax as a ConditionExpression . For
1847 more information on expression syntax, go to `Specifying
1848 Conditions`_ in the Amazon DynamoDB Developer Guide .
1849
1850 :type expression_attribute_names: map
1851 :param expression_attribute_names: One or more substitution tokens for
1852 simplifying complex expressions. The following are some use cases
1853 for using ExpressionAttributeNames :
1854
1855 + To shorten an attribute name that is very long or unwieldy in an
1856 expression.
1857 + To create a placeholder for repeating occurrences of an attribute
1858 name in an expression.
1859 + To prevent special characters in an attribute name from being
1860 misinterpreted in an expression.
1861
1862
1863 Use the **#** character in an expression to dereference an attribute
1864 name. For example, consider the following expression:
1865
1866
1867 + `order.customerInfo.LastName = "Smith" OR order.customerInfo.LastName
1868 = "Jones"`
1869
1870
1871 Now suppose that you specified the following for
1872 ExpressionAttributeNames :
1873
1874
1875 + `{"#name":"order.customerInfo.LastName"}`
1876
1877
1878 The expression can now be simplified as follows:
1879
1880
1881 + `#name = "Smith" OR #name = "Jones"`
1882
1883
1884 For more information on expression attribute names, go to `Accessing
1885 Item Attributes`_ in the Amazon DynamoDB Developer Guide .
1886
1887 :type expression_attribute_values: map
1888 :param expression_attribute_values: One or more values that can be
1889 substituted in an expression.
1890 Use the **:** (colon) character in an expression to dereference an
1891 attribute value. For example, suppose that you wanted to check
1892 whether the value of the ProductStatus attribute was one of the
1893 following:
1894
1895 `Available | Backordered | Discontinued`
1896
1897 You would first need to specify ExpressionAttributeValues as follows:
1898
1899 `{ ":avail":{"S":"Available"}, ":back":{"S":"Backordered"},
1900 ":disc":{"S":"Discontinued"} }`
1901
1902 You could then use these values in an expression, such as this:
1903
1904 `ProductStatus IN (:avail, :back, :disc)`
1905
1906 For more information on expression attribute values, go to `Specifying
1907 Conditions`_ in the Amazon DynamoDB Developer Guide .
1908
1909 """
1910 params = {
1911 'TableName': table_name,
1912 'KeyConditions': key_conditions,
1913 }
1914 if index_name is not None:
1915 params['IndexName'] = index_name
1916 if select is not None:
1917 params['Select'] = select
1918 if attributes_to_get is not None:
1919 params['AttributesToGet'] = attributes_to_get
1920 if limit is not None:
1921 params['Limit'] = limit
1922 if consistent_read is not None:
1923 params['ConsistentRead'] = consistent_read
1924 if query_filter is not None:
1925 params['QueryFilter'] = query_filter
1926 if conditional_operator is not None:
1927 params['ConditionalOperator'] = conditional_operator
1928 if scan_index_forward is not None:
1929 params['ScanIndexForward'] = scan_index_forward
1930 if exclusive_start_key is not None:
1931 params['ExclusiveStartKey'] = exclusive_start_key
1932 if return_consumed_capacity is not None:
1933 params['ReturnConsumedCapacity'] = return_consumed_capacity
1934 if projection_expression is not None:
1935 params['ProjectionExpression'] = projection_expression
1936 if filter_expression is not None:
1937 params['FilterExpression'] = filter_expression
1938 if expression_attribute_names is not None:
1939 params['ExpressionAttributeNames'] = expression_attribute_names
1940 if expression_attribute_values is not None:
1941 params['ExpressionAttributeValues'] = expression_attribute_values
1942 return self.make_request(action='Query',
1943 body=json.dumps(params))
1944
1945 def scan(self, table_name, attributes_to_get=None, limit=None,
1946 select=None, scan_filter=None, conditional_operator=None,
1947 exclusive_start_key=None, return_consumed_capacity=None,
1948 total_segments=None, segment=None, projection_expression=None,
1949 filter_expression=None, expression_attribute_names=None,
1950 expression_attribute_values=None):
1951 """
1952 The Scan operation returns one or more items and item
1953 attributes by accessing every item in the table. To have
1954 DynamoDB return fewer items, you can provide a ScanFilter
1955 operation.
1956
1957 If the total number of scanned items exceeds the maximum data
1958 set size limit of 1 MB, the scan stops and results are
1959 returned to the user as a LastEvaluatedKey value to continue
1960 the scan in a subsequent operation. The results also include
1961 the number of items exceeding the limit. A scan can result in
1962 no table data meeting the filter criteria.
1963
1964 The result set is eventually consistent.
1965
1966 By default, Scan operations proceed sequentially; however, for
1967 faster performance on large tables, applications can request a
1968 parallel Scan operation by specifying the Segment and
1969 TotalSegments parameters. For more information, see `Parallel
1970 Scan`_ in the Amazon DynamoDB Developer Guide .
1971
1972 :type table_name: string
1973 :param table_name: The name of the table containing the requested
1974 items.
1975
1976 :type attributes_to_get: list
1977 :param attributes_to_get:
1978 There is a newer parameter available. Use ProjectionExpression instead.
1979 Note that if you use AttributesToGet and ProjectionExpression at
1980 the same time, DynamoDB will return a ValidationException
1981 exception.
1982
1983 This parameter allows you to retrieve lists or maps; however, it cannot
1984 retrieve individual list or map elements.
1985
1986 The names of one or more attributes to retrieve. If no attribute names
1987 are specified, then all attributes will be returned. If any of the
1988 requested attributes are not found, they will not appear in the
1989 result.
1990
1991 Note that AttributesToGet has no effect on provisioned throughput
1992 consumption. DynamoDB determines capacity units consumed based on
1993 item size, not on the amount of data that is returned to an
1994 application.
1995
1996 :type limit: integer
1997 :param limit: The maximum number of items to evaluate (not necessarily
1998 the number of matching items). If DynamoDB processes the number of
1999 items up to the limit while processing the results, it stops the
2000 operation and returns the matching values up to that point, and a
2001 key in LastEvaluatedKey to apply in a subsequent operation, so that
2002 you can pick up where you left off. Also, if the processed data set
2003 size exceeds 1 MB before DynamoDB reaches this limit, it stops the
2004 operation and returns the matching values up to the limit, and a
2005 key in LastEvaluatedKey to apply in a subsequent operation to
2006 continue the operation. For more information, see `Query and Scan`_
2007 in the Amazon DynamoDB Developer Guide .
2008
2009 :type select: string
2010 :param select: The attributes to be returned in the result. You can
2011 retrieve all item attributes, specific item attributes, or the
2012 count of matching items.
2013
2014 + `ALL_ATTRIBUTES` - Returns all of the item attributes.
2015 + `COUNT` - Returns the number of matching items, rather than the
2016 matching items themselves.
2017 + `SPECIFIC_ATTRIBUTES` - Returns only the attributes listed in
2018 AttributesToGet . This return value is equivalent to specifying
2019 AttributesToGet without specifying any value for Select .
2020
2021
2022 If neither Select nor AttributesToGet are specified, DynamoDB defaults
2023 to `ALL_ATTRIBUTES`. You cannot use both AttributesToGet and Select
2024 together in a single request, unless the value for Select is
2025 `SPECIFIC_ATTRIBUTES`. (This usage is equivalent to specifying
2026 AttributesToGet without any value for Select .)
2027
2028 :type scan_filter: map
2029 :param scan_filter:
2030 There is a newer parameter available. Use FilterExpression instead.
2031 Note that if you use ScanFilter and FilterExpression at the same
2032 time, DynamoDB will return a ValidationException exception.
2033
2034 This parameter does not support lists or maps.
2035
2036 A condition that evaluates the scan results and returns only the
2037 desired values.
2038
2039 If you specify more than one condition in the ScanFilter map, then by
2040 default all of the conditions must evaluate to true. In other
2041 words, the conditions are ANDed together. (You can use the
2042 ConditionalOperator parameter to OR the conditions instead. If you
2043 do this, then at least one of the conditions must evaluate to true,
2044 rather than all of them.)
2045
2046 Each ScanFilter element consists of an attribute name to compare, along
2047 with the following:
2048
2049
2050 + AttributeValueList - One or more values to evaluate against the
2051 supplied attribute. The number of values in the list depends on the
2052 operator specified in ComparisonOperator . For type Number, value
2053 comparisons are numeric. String value comparisons for greater than,
2054 equals, or less than are based on ASCII character code values. For
2055 example, `a` is greater than `A`, and `a` is greater than `B`. For
2056 a list of code values, see
2057 `http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters`_.
2058 For Binary, DynamoDB treats each byte of the binary data as
2059 unsigned when it compares binary values, for example when
2060 evaluating query expressions. For information on specifying data
2061 types in JSON, see `JSON Data Format`_ in the Amazon DynamoDB
2062 Developer Guide .
2063 + ComparisonOperator - A comparator for evaluating attributes. For
2064 example, equals, greater than, less than, etc. The following
2065 comparison operators are available: `EQ | NE | LE | LT | GE | GT |
2066 NOT_NULL | NULL | CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN |
2067 BETWEEN` For complete descriptions of all comparison operators, see
2068 `Condition`_.
2069
2070 :type conditional_operator: string
2071 :param conditional_operator:
2072 There is a newer parameter available. Use ConditionExpression instead.
2073 Note that if you use ConditionalOperator and ConditionExpression at
2074 the same time, DynamoDB will return a ValidationException
2075 exception.
2076
2077 This parameter does not support lists or maps.
2078
2079 A logical operator to apply to the conditions in the ScanFilter map:
2080
2081
2082 + `AND` - If all of the conditions evaluate to true, then the entire
2083 map evaluates to true.
2084 + `OR` - If at least one of the conditions evaluate to true, then the
2085 entire map evaluates to true.
2086
2087
2088 If you omit ConditionalOperator , then `AND` is the default.
2089
2090 The operation will succeed only if the entire map evaluates to true.
2091
2092 :type exclusive_start_key: map
2093 :param exclusive_start_key: The primary key of the first item that this
2094 operation will evaluate. Use the value that was returned for
2095 LastEvaluatedKey in the previous operation.
2096 The data type for ExclusiveStartKey must be String, Number or Binary.
2097 No set data types are allowed.
2098
2099 In a parallel scan, a Scan request that includes ExclusiveStartKey must
2100 specify the same segment whose previous Scan returned the
2101 corresponding value of LastEvaluatedKey .
2102
2103 :type return_consumed_capacity: string
2104 :param return_consumed_capacity: A value that if set to `TOTAL`, the
2105 response includes ConsumedCapacity data for tables and indexes. If
2106 set to `INDEXES`, the response includes ConsumedCapacity for
2107 indexes. If set to `NONE` (the default), ConsumedCapacity is not
2108 included in the response.
2109
2110 :type total_segments: integer
2111 :param total_segments: For a parallel Scan request, TotalSegments
2112 represents the total number of segments into which the Scan
2113 operation will be divided. The value of TotalSegments corresponds
2114 to the number of application workers that will perform the parallel
2115 scan. For example, if you want to scan a table using four
2116 application threads, specify a TotalSegments value of 4.
2117 The value for TotalSegments must be greater than or equal to 1, and
2118 less than or equal to 1000000. If you specify a TotalSegments value
2119 of 1, the Scan operation will be sequential rather than parallel.
2120
2121 If you specify TotalSegments , you must also specify Segment .
2122
2123 :type segment: integer
2124 :param segment: For a parallel Scan request, Segment identifies an
2125 individual segment to be scanned by an application worker.
2126 Segment IDs are zero-based, so the first segment is always 0. For
2127 example, if you want to scan a table using four application
2128 threads, the first thread specifies a Segment value of 0, the
2129 second thread specifies 1, and so on.
2130
2131 The value of LastEvaluatedKey returned from a parallel Scan request
2132 must be used as ExclusiveStartKey with the same segment ID in a
2133 subsequent Scan operation.
2134
2135 The value for Segment must be greater than or equal to 0, and less than
2136 the value provided for TotalSegments .
2137
2138 If you specify Segment , you must also specify TotalSegments .
2139
2140 :type projection_expression: string
2141 :param projection_expression: A string that identifies one or more
2142 attributes to retrieve from the table. These attributes can include
2143 scalars, sets, or elements of a JSON document. The attributes in
2144 the expression must be separated by commas.
2145 If no attribute names are specified, then all attributes will be
2146 returned. If any of the requested attributes are not found, they
2147 will not appear in the result.
2148
2149 For more information on projection expressions, go to `Accessing Item
2150 Attributes`_ in the Amazon DynamoDB Developer Guide .
2151
2152 :type filter_expression: string
2153 :param filter_expression: A condition that evaluates the scan results
2154 and returns only the desired values.
2155 The condition you specify is applied to the items scanned; any items
2156 that do not match the expression are not returned.
2157
2158 :type expression_attribute_names: map
2159 :param expression_attribute_names: One or more substitution tokens for
2160 simplifying complex expressions. The following are some use cases
2161 for using ExpressionAttributeNames :
2162
2163 + To shorten an attribute name that is very long or unwieldy in an
2164 expression.
2165 + To create a placeholder for repeating occurrences of an attribute
2166 name in an expression.
2167 + To prevent special characters in an attribute name from being
2168 misinterpreted in an expression.
2169
2170
2171 Use the **#** character in an expression to dereference an attribute
2172 name. For example, consider the following expression:
2173
2174
2175 + `order.customerInfo.LastName = "Smith" OR order.customerInfo.LastName
2176 = "Jones"`
2177
2178
2179 Now suppose that you specified the following for
2180 ExpressionAttributeNames :
2181
2182
2183 + `{"#name":"order.customerInfo.LastName"}`
2184
2185
2186 The expression can now be simplified as follows:
2187
2188
2189 + `#name = "Smith" OR #name = "Jones"`
2190
2191
2192 For more information on expression attribute names, go to `Accessing
2193 Item Attributes`_ in the Amazon DynamoDB Developer Guide .
2194
2195 :type expression_attribute_values: map
2196 :param expression_attribute_values: One or more values that can be
2197 substituted in an expression.
2198 Use the **:** (colon) character in an expression to dereference an
2199 attribute value. For example, suppose that you wanted to check
2200 whether the value of the ProductStatus attribute was one of the
2201 following:
2202
2203 `Available | Backordered | Discontinued`
2204
2205 You would first need to specify ExpressionAttributeValues as follows:
2206
2207 `{ ":avail":{"S":"Available"}, ":back":{"S":"Backordered"},
2208 ":disc":{"S":"Discontinued"} }`
2209
2210 You could then use these values in an expression, such as this:
2211
2212 `ProductStatus IN (:avail, :back, :disc)`
2213
2214 For more information on expression attribute values, go to `Specifying
2215 Conditions`_ in the Amazon DynamoDB Developer Guide .
2216
2217 """
2218 params = {'TableName': table_name, }
2219 if attributes_to_get is not None:
2220 params['AttributesToGet'] = attributes_to_get
2221 if limit is not None:
2222 params['Limit'] = limit
2223 if select is not None:
2224 params['Select'] = select
2225 if scan_filter is not None:
2226 params['ScanFilter'] = scan_filter
2227 if conditional_operator is not None:
2228 params['ConditionalOperator'] = conditional_operator
2229 if exclusive_start_key is not None:
2230 params['ExclusiveStartKey'] = exclusive_start_key
2231 if return_consumed_capacity is not None:
2232 params['ReturnConsumedCapacity'] = return_consumed_capacity
2233 if total_segments is not None:
2234 params['TotalSegments'] = total_segments
2235 if segment is not None:
2236 params['Segment'] = segment
2237 if projection_expression is not None:
2238 params['ProjectionExpression'] = projection_expression
2239 if filter_expression is not None:
2240 params['FilterExpression'] = filter_expression
2241 if expression_attribute_names is not None:
2242 params['ExpressionAttributeNames'] = expression_attribute_names
2243 if expression_attribute_values is not None:
2244 params['ExpressionAttributeValues'] = expression_attribute_values
2245 return self.make_request(action='Scan',
2246 body=json.dumps(params))
2247
2248 def update_item(self, table_name, key, attribute_updates=None,
2249 expected=None, conditional_operator=None,
2250 return_values=None, return_consumed_capacity=None,
2251 return_item_collection_metrics=None,
2252 update_expression=None, condition_expression=None,
2253 expression_attribute_names=None,
2254 expression_attribute_values=None):
2255 """
2256 Edits an existing item's attributes, or adds a new item to the
2257 table if it does not already exist. You can put, delete, or
2258 add attribute values. You can also perform a conditional
2259 update (insert a new attribute name-value pair if it doesn't
2260 exist, or replace an existing name-value pair if it has
2261 certain expected attribute values).
2262
2263 You can also return the item's attribute values in the same
2264 UpdateItem operation using the ReturnValues parameter.
2265
2266 :type table_name: string
2267 :param table_name: The name of the table containing the item to update.
2268
2269 :type key: map
2270 :param key: The primary key of the item to be updated. Each element
2271 consists of an attribute name and a value for that attribute.
2272 For the primary key, you must provide all of the attributes. For
2273 example, with a hash type primary key, you only need to specify the
2274 hash attribute. For a hash-and-range type primary key, you must
2275 specify both the hash attribute and the range attribute.
2276
2277 :type attribute_updates: map
2278 :param attribute_updates:
2279 There is a newer parameter available. Use UpdateExpression instead.
2280 Note that if you use AttributeUpdates and UpdateExpression at the
2281 same time, DynamoDB will return a ValidationException exception.
2282
2283 This parameter can be used for modifying top-level attributes; however,
2284 it does not support individual list or map elements.
2285
2286 The names of attributes to be modified, the action to perform on each,
2287 and the new value for each. If you are updating an attribute that
2288 is an index key attribute for any indexes on that table, the
2289 attribute type must match the index key type defined in the
2290 AttributesDefinition of the table description. You can use
2291 UpdateItem to update any nonkey attributes.
2292
2293 Attribute values cannot be null. String and Binary type attributes must
2294 have lengths greater than zero. Set type attributes must not be
2295 empty. Requests with empty values will be rejected with a
2296 ValidationException exception.
2297
2298 Each AttributeUpdates element consists of an attribute name to modify,
2299 along with the following:
2300
2301
2302 + Value - The new value, if applicable, for this attribute.
2303 + Action - A value that specifies how to perform the update. This
2304 action is only valid for an existing attribute whose data type is
2305 Number or is a set; do not use `ADD` for other data types. If an
2306 item with the specified primary key is found in the table, the
2307 following values perform the following actions:
2308
2309 + `PUT` - Adds the specified attribute to the item. If the attribute
2310 already exists, it is replaced by the new value.
2311 + `DELETE` - Removes the attribute and its value, if no value is
2312 specified for `DELETE`. The data type of the specified value must
2313 match the existing value's data type. If a set of values is
2314 specified, then those values are subtracted from the old set. For
2315 example, if the attribute value was the set `[a,b,c]` and the
2316 `DELETE` action specifies `[a,c]`, then the final attribute value
2317 is `[b]`. Specifying an empty set is an error.
2318 + `ADD` - Adds the specified value to the item, if the attribute does
2319 not already exist. If the attribute does exist, then the behavior
2320 of `ADD` depends on the data type of the attribute:
2321
2322 + If the existing attribute is a number, and if Value is also a number,
2323 then Value is mathematically added to the existing attribute. If
2324 Value is a negative number, then it is subtracted from the existing
2325 attribute. If you use `ADD` to increment or decrement a number
2326 value for an item that doesn't exist before the update, DynamoDB
2327 uses 0 as the initial value. Similarly, if you use `ADD` for an
2328 existing item to increment or decrement an attribute value that
2329 doesn't exist before the update, DynamoDB uses `0` as the initial
2330 value. For example, suppose that the item you want to update
2331 doesn't have an attribute named itemcount , but you decide to `ADD`
2332 the number `3` to this attribute anyway. DynamoDB will create the
2333 itemcount attribute, set its initial value to `0`, and finally add
2334 `3` to it. The result will be a new itemcount attribute, with a
2335 value of `3`.
2336 + If the existing data type is a set, and if Value is also a set, then
2337 Value is appended to the existing set. For example, if the
2338 attribute value is the set `[1,2]`, and the `ADD` action specified
2339 `[3]`, then the final attribute value is `[1,2,3]`. An error occurs
2340 if an `ADD` action is specified for a set attribute and the
2341 attribute type specified does not match the existing set type. Both
2342 sets must have the same primitive data type. For example, if the
2343 existing data type is a set of strings, Value must also be a set of
2344 strings.
2345
2346 If no item with the specified key is found in the table, the following
2347 values perform the following actions:
2348
2349 + `PUT` - Causes DynamoDB to create a new item with the specified
2350 primary key, and then adds the attribute.
2351 + `DELETE` - Nothing happens, because attributes cannot be deleted from
2352 a nonexistent item. The operation succeeds, but DynamoDB does not
2353 create a new item.
2354 + `ADD` - Causes DynamoDB to create an item with the supplied primary
2355 key and number (or set of numbers) for the attribute value. The
2356 only data types allowed are Number and Number Set.
2357
2358
2359
2360 If you specify any attributes that are part of an index key, then the
2361 data types for those attributes must match those of the schema in
2362 the table's attribute definition.
2363
2364 :type expected: map
2365 :param expected:
2366 There is a newer parameter available. Use ConditionExpression instead.
2367 Note that if you use Expected and ConditionExpression at the same
2368 time, DynamoDB will return a ValidationException exception.
2369
2370 This parameter does not support lists or maps.
2371
2372 A map of attribute/condition pairs. Expected provides a conditional
2373 block for the UpdateItem operation.
2374
2375 Each element of Expected consists of an attribute name, a comparison
2376 operator, and one or more values. DynamoDB compares the attribute
2377 with the value(s) you supplied, using the comparison operator. For
2378 each Expected element, the result of the evaluation is either true
2379 or false.
2380
2381 If you specify more than one element in the Expected map, then by
2382 default all of the conditions must evaluate to true. In other
2383 words, the conditions are ANDed together. (You can use the
2384 ConditionalOperator parameter to OR the conditions instead. If you
2385 do this, then at least one of the conditions must evaluate to true,
2386 rather than all of them.)
2387
2388 If the Expected map evaluates to true, then the conditional operation
2389 succeeds; otherwise, it fails.
2390
2391 Expected contains the following:
2392
2393
2394 + AttributeValueList - One or more values to evaluate against the
2395 supplied attribute. The number of values in the list depends on the
2396 ComparisonOperator being used. For type Number, value comparisons
2397 are numeric. String value comparisons for greater than, equals, or
2398 less than are based on ASCII character code values. For example,
2399 `a` is greater than `A`, and `a` is greater than `B`. For a list of
2400 code values, see
2401 `http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters`_.
2402 For type Binary, DynamoDB treats each byte of the binary data as
2403 unsigned when it compares binary values, for example when
2404 evaluating query expressions.
2405 + ComparisonOperator - A comparator for evaluating attributes in the
2406 AttributeValueList . When performing the comparison, DynamoDB uses
2407 strongly consistent reads. The following comparison operators are
2408 available: `EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL |
2409 CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN` The following
2410 are descriptions of each comparison operator.
2411
2412 + `EQ` : Equal. `EQ` is supported for all datatypes, including lists
2413 and maps. AttributeValueList can contain only one AttributeValue
2414 element of type String, Number, Binary, String Set, Number Set, or
2415 Binary Set. If an item contains an AttributeValue element of a
2416 different type than the one specified in the request, the value
2417 does not match. For example, `{"S":"6"}` does not equal
2418 `{"N":"6"}`. Also, `{"N":"6"}` does not equal `{"NS":["6", "2",
2419 "1"]}`. > <li>
2420 + `NE` : Not equal. `NE` is supported for all datatypes, including
2421 lists and maps. AttributeValueList can contain only one
2422 AttributeValue of type String, Number, Binary, String Set, Number
2423 Set, or Binary Set. If an item contains an AttributeValue of a
2424 different type than the one specified in the request, the value
2425 does not match. For example, `{"S":"6"}` does not equal
2426 `{"N":"6"}`. Also, `{"N":"6"}` does not equal `{"NS":["6", "2",
2427 "1"]}`. > <li>
2428 + `LE` : Less than or equal. AttributeValueList can contain only one
2429 AttributeValue element of type String, Number, or Binary (not a set
2430 type). If an item contains an AttributeValue element of a different
2431 type than the one specified in the request, the value does not
2432 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
2433 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
2434 + `LT` : Less than. AttributeValueList can contain only one
2435 AttributeValue of type String, Number, or Binary (not a set type).
2436 If an item contains an AttributeValue element of a different type
2437 than the one specified in the request, the value does not match.
2438 For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
2439 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
2440 + `GE` : Greater than or equal. AttributeValueList can contain only one
2441 AttributeValue element of type String, Number, or Binary (not a set
2442 type). If an item contains an AttributeValue element of a different
2443 type than the one specified in the request, the value does not
2444 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
2445 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
2446 + `GT` : Greater than. AttributeValueList can contain only one
2447 AttributeValue element of type String, Number, or Binary (not a set
2448 type). If an item contains an AttributeValue element of a different
2449 type than the one specified in the request, the value does not
2450 match. For example, `{"S":"6"}` does not equal `{"N":"6"}`. Also,
2451 `{"N":"6"}` does not compare to `{"NS":["6", "2", "1"]}`. > <li>
2452 + `NOT_NULL` : The attribute exists. `NOT_NULL` is supported for all
2453 datatypes, including lists and maps. This operator tests for the
2454 existence of an attribute, not its data type. If the data type of
2455 attribute " `a`" is null, and you evaluate it using `NOT_NULL`, the
2456 result is a Boolean true . This result is because the attribute "
2457 `a`" exists; its data type is not relevant to the `NOT_NULL`
2458 comparison operator.
2459 + `NULL` : The attribute does not exist. `NULL` is supported for all
2460 datatypes, including lists and maps. This operator tests for the
2461 nonexistence of an attribute, not its data type. If the data type
2462 of attribute " `a`" is null, and you evaluate it using `NULL`, the
2463 result is a Boolean false . This is because the attribute " `a`"
2464 exists; its data type is not relevant to the `NULL` comparison
2465 operator.
2466 + `CONTAINS` : Checks for a subsequence, or value in a set.
2467 AttributeValueList can contain only one AttributeValue element of
2468 type String, Number, or Binary (not a set type). If the target
2469 attribute of the comparison is of type String, then the operator
2470 checks for a substring match. If the target attribute of the
2471 comparison is of type Binary, then the operator looks for a
2472 subsequence of the target that matches the input. If the target
2473 attribute of the comparison is a set (" `SS`", " `NS`", or "
2474 `BS`"), then the operator evaluates to true if it finds an exact
2475 match with any member of the set. CONTAINS is supported for lists:
2476 When evaluating " `a CONTAINS b`", " `a`" can be a list; however, "
2477 `b`" cannot be a set, a map, or a list.
2478 + `NOT_CONTAINS` : Checks for absence of a subsequence, or absence of a
2479 value in a set. AttributeValueList can contain only one
2480 AttributeValue element of type String, Number, or Binary (not a set
2481 type). If the target attribute of the comparison is a String, then
2482 the operator checks for the absence of a substring match. If the
2483 target attribute of the comparison is Binary, then the operator
2484 checks for the absence of a subsequence of the target that matches
2485 the input. If the target attribute of the comparison is a set ("
2486 `SS`", " `NS`", or " `BS`"), then the operator evaluates to true if
2487 it does not find an exact match with any member of the set.
2488 NOT_CONTAINS is supported for lists: When evaluating " `a NOT
2489 CONTAINS b`", " `a`" can be a list; however, " `b`" cannot be a
2490 set, a map, or a list.
2491 + `BEGINS_WITH` : Checks for a prefix. AttributeValueList can contain
2492 only one AttributeValue of type String or Binary (not a Number or a
2493 set type). The target attribute of the comparison must be of type
2494 String or Binary (not a Number or a set type). > <li>
2495 + `IN` : Checks for matching elements within two sets.
2496 AttributeValueList can contain one or more AttributeValue elements
2497 of type String, Number, or Binary (not a set type). These
2498 attributes are compared against an existing set type attribute of
2499 an item. If any elements of the input set are present in the item
2500 attribute, the expression evaluates to true.
2501 + `BETWEEN` : Greater than or equal to the first value, and less than
2502 or equal to the second value. AttributeValueList must contain two
2503 AttributeValue elements of the same type, either String, Number, or
2504 Binary (not a set type). A target attribute matches if the target
2505 value is greater than, or equal to, the first element and less
2506 than, or equal to, the second element. If an item contains an
2507 AttributeValue element of a different type than the one specified
2508 in the request, the value does not match. For example, `{"S":"6"}`
2509 does not compare to `{"N":"6"}`. Also, `{"N":"6"}` does not compare
2510 to `{"NS":["6", "2", "1"]}`
2511
2512
2513
2514 For usage examples of AttributeValueList and ComparisonOperator , see
2515 `Legacy Conditional Parameters`_ in the Amazon DynamoDB Developer
2516 Guide .
2517
2518 For backward compatibility with previous DynamoDB releases, the
2519 following parameters can be used instead of AttributeValueList and
2520 ComparisonOperator :
2521
2522
2523 + Value - A value for DynamoDB to compare with an attribute.
2524 + Exists - A Boolean value that causes DynamoDB to evaluate the value
2525 before attempting the conditional operation:
2526
2527 + If Exists is `True`, DynamoDB will check to see if that attribute
2528 value already exists in the table. If it is found, then the
2529 condition evaluates to true; otherwise the condition evaluate to
2530 false.
2531 + If Exists is `False`, DynamoDB assumes that the attribute value does
2532 not exist in the table. If in fact the value does not exist, then
2533 the assumption is valid and the condition evaluates to true. If the
2534 value is found, despite the assumption that it does not exist, the
2535 condition evaluates to false.
2536 Note that the default value for Exists is `True`.
2537
2538
2539 The Value and Exists parameters are incompatible with
2540 AttributeValueList and ComparisonOperator . Note that if you use
2541 both sets of parameters at once, DynamoDB will return a
2542 ValidationException exception.
2543
2544 :type conditional_operator: string
2545 :param conditional_operator:
2546 There is a newer parameter available. Use ConditionExpression instead.
2547 Note that if you use ConditionalOperator and ConditionExpression at
2548 the same time, DynamoDB will return a ValidationException
2549 exception.
2550
2551 This parameter does not support lists or maps.
2552
2553 A logical operator to apply to the conditions in the Expected map:
2554
2555
2556 + `AND` - If all of the conditions evaluate to true, then the entire
2557 map evaluates to true.
2558 + `OR` - If at least one of the conditions evaluate to true, then the
2559 entire map evaluates to true.
2560
2561
2562 If you omit ConditionalOperator , then `AND` is the default.
2563
2564 The operation will succeed only if the entire map evaluates to true.
2565
2566 :type return_values: string
2567 :param return_values:
2568 Use ReturnValues if you want to get the item attributes as they
2569 appeared either before or after they were updated. For UpdateItem ,
2570 the valid values are:
2571
2572
2573 + `NONE` - If ReturnValues is not specified, or if its value is `NONE`,
2574 then nothing is returned. (This setting is the default for
2575 ReturnValues .)
2576 + `ALL_OLD` - If UpdateItem overwrote an attribute name-value pair,
2577 then the content of the old item is returned.
2578 + `UPDATED_OLD` - The old versions of only the updated attributes are
2579 returned.
2580 + `ALL_NEW` - All of the attributes of the new version of the item are
2581 returned.
2582 + `UPDATED_NEW` - The new versions of only the updated attributes are
2583 returned.
2584
2585 :type return_consumed_capacity: string
2586 :param return_consumed_capacity: A value that if set to `TOTAL`, the
2587 response includes ConsumedCapacity data for tables and indexes. If
2588 set to `INDEXES`, the response includes ConsumedCapacity for
2589 indexes. If set to `NONE` (the default), ConsumedCapacity is not
2590 included in the response.
2591
2592 :type return_item_collection_metrics: string
2593 :param return_item_collection_metrics: A value that if set to `SIZE`,
2594 the response includes statistics about item collections, if any,
2595 that were modified during the operation are returned in the
2596 response. If set to `NONE` (the default), no statistics are
2597 returned.
2598
2599 :type update_expression: string
2600 :param update_expression: An expression that defines one or more
2601 attributes to be updated, the action to be performed on them, and
2602 new value(s) for them.
2603 The following action values are available for UpdateExpression .
2604
2605
2606 + `SET` - Adds one or more attributes and values to an item. If any of
2607 these attribute already exist, they are replaced by the new values.
2608 You can also use `SET` to add or subtract from an attribute that is
2609 of type Number. `SET` supports the following functions:
2610
2611 + `if_not_exists (path, operand)` - if the item does not contain an
2612 attribute at the specified path, then `if_not_exists` evaluates to
2613 operand; otherwise, it evaluates to path. You can use this function
2614 to avoid overwriting an attribute that may already be present in
2615 the item.
2616 + `list_append (operand, operand)` - evaluates to a list with a new
2617 element added to it. You can append the new element to the start or
2618 the end of the list by reversing the order of the operands.
2619 These function names are case-sensitive.
2620 + `REMOVE` - Removes one or more attributes from an item.
2621 + `ADD` - Adds the specified value to the item, if the attribute does
2622 not already exist. If the attribute does exist, then the behavior
2623 of `ADD` depends on the data type of the attribute:
2624
2625 + If the existing attribute is a number, and if Value is also a number,
2626 then Value is mathematically added to the existing attribute. If
2627 Value is a negative number, then it is subtracted from the existing
2628 attribute. If you use `ADD` to increment or decrement a number
2629 value for an item that doesn't exist before the update, DynamoDB
2630 uses `0` as the initial value. Similarly, if you use `ADD` for an
2631 existing item to increment or decrement an attribute value that
2632 doesn't exist before the update, DynamoDB uses `0` as the initial
2633 value. For example, suppose that the item you want to update
2634 doesn't have an attribute named itemcount , but you decide to `ADD`
2635 the number `3` to this attribute anyway. DynamoDB will create the
2636 itemcount attribute, set its initial value to `0`, and finally add
2637 `3` to it. The result will be a new itemcount attribute in the
2638 item, with a value of `3`.
2639 + If the existing data type is a set and if Value is also a set, then
2640 Value is added to the existing set. For example, if the attribute
2641 value is the set `[1,2]`, and the `ADD` action specified `[3]`,
2642 then the final attribute value is `[1,2,3]`. An error occurs if an
2643 `ADD` action is specified for a set attribute and the attribute
2644 type specified does not match the existing set type. Both sets must
2645 have the same primitive data type. For example, if the existing
2646 data type is a set of strings, the Value must also be a set of
2647 strings.
2648 The `ADD` action only supports Number and set data types. In addition,
2649 `ADD` can only be used on top-level attributes, not nested
2650 attributes.
2651 + `DELETE` - Deletes an element from a set. If a set of values is
2652 specified, then those values are subtracted from the old set. For
2653 example, if the attribute value was the set `[a,b,c]` and the
2654 `DELETE` action specifies `[a,c]`, then the final attribute value
2655 is `[b]`. Specifying an empty set is an error. The `DELETE` action
2656 only supports Number and set data types. In addition, `DELETE` can
2657 only be used on top-level attributes, not nested attributes.
2658
2659
2660 You can have many actions in a single expression, such as the
2661 following: `SET a=:value1, b=:value2 DELETE :value3, :value4,
2662 :value5`
2663
2664 For more information on update expressions, go to `Modifying Items and
2665 Attributes`_ in the Amazon DynamoDB Developer Guide .
2666
2667 :type condition_expression: string
2668 :param condition_expression: A condition that must be satisfied in
2669 order for a conditional update to succeed.
2670 An expression can contain any of the following:
2671
2672
2673 + Boolean functions: `attribute_exists | attribute_not_exists |
2674 contains | begins_with` These function names are case-sensitive.
2675 + Comparison operators: ` = | <> | < | > | <=
2676 | >= | BETWEEN | IN`
2677 + Logical operators: `AND | OR | NOT`
2678
2679
2680 For more information on condition expressions, go to `Specifying
2681 Conditions`_ in the Amazon DynamoDB Developer Guide .
2682
2683 :type expression_attribute_names: map
2684 :param expression_attribute_names: One or more substitution tokens for
2685 simplifying complex expressions. The following are some use cases
2686 for using ExpressionAttributeNames :
2687
2688 + To shorten an attribute name that is very long or unwieldy in an
2689 expression.
2690 + To create a placeholder for repeating occurrences of an attribute
2691 name in an expression.
2692 + To prevent special characters in an attribute name from being
2693 misinterpreted in an expression.
2694
2695
2696 Use the **#** character in an expression to dereference an attribute
2697 name. For example, consider the following expression:
2698
2699
2700 + `order.customerInfo.LastName = "Smith" OR order.customerInfo.LastName
2701 = "Jones"`
2702
2703
2704 Now suppose that you specified the following for
2705 ExpressionAttributeNames :
2706
2707
2708 + `{"#name":"order.customerInfo.LastName"}`
2709
2710
2711 The expression can now be simplified as follows:
2712
2713
2714 + `#name = "Smith" OR #name = "Jones"`
2715
2716
2717 For more information on expression attribute names, go to `Accessing
2718 Item Attributes`_ in the Amazon DynamoDB Developer Guide .
2719
2720 :type expression_attribute_values: map
2721 :param expression_attribute_values: One or more values that can be
2722 substituted in an expression.
2723 Use the **:** (colon) character in an expression to dereference an
2724 attribute value. For example, suppose that you wanted to check
2725 whether the value of the ProductStatus attribute was one of the
2726 following:
2727
2728 `Available | Backordered | Discontinued`
2729
2730 You would first need to specify ExpressionAttributeValues as follows:
2731
2732 `{ ":avail":{"S":"Available"}, ":back":{"S":"Backordered"},
2733 ":disc":{"S":"Discontinued"} }`
2734
2735 You could then use these values in an expression, such as this:
2736
2737 `ProductStatus IN (:avail, :back, :disc)`
2738
2739 For more information on expression attribute values, go to `Specifying
2740 Conditions`_ in the Amazon DynamoDB Developer Guide .
2741
2742 """
2743 params = {'TableName': table_name, 'Key': key, }
2744 if attribute_updates is not None:
2745 params['AttributeUpdates'] = attribute_updates
2746 if expected is not None:
2747 params['Expected'] = expected
2748 if conditional_operator is not None:
2749 params['ConditionalOperator'] = conditional_operator
2750 if return_values is not None:
2751 params['ReturnValues'] = return_values
2752 if return_consumed_capacity is not None:
2753 params['ReturnConsumedCapacity'] = return_consumed_capacity
2754 if return_item_collection_metrics is not None:
2755 params['ReturnItemCollectionMetrics'] = return_item_collection_metrics
2756 if update_expression is not None:
2757 params['UpdateExpression'] = update_expression
2758 if condition_expression is not None:
2759 params['ConditionExpression'] = condition_expression
2760 if expression_attribute_names is not None:
2761 params['ExpressionAttributeNames'] = expression_attribute_names
2762 if expression_attribute_values is not None:
2763 params['ExpressionAttributeValues'] = expression_attribute_values
2764 return self.make_request(action='UpdateItem',
2765 body=json.dumps(params))
2766
2767 def update_table(self, table_name, provisioned_throughput=None,
2768 global_secondary_index_updates=None,
2769 attribute_definitions=None):
2770 """
2771 Updates the provisioned throughput for the given table, or
2772 manages the global secondary indexes on the table.
2773
2774 You can increase or decrease the table's provisioned
2775 throughput values within the maximums and minimums listed in
2776 the `Limits`_ section in the Amazon DynamoDB Developer Guide .
2777
2778 In addition, you can use UpdateTable to add, modify or delete
2779 global secondary indexes on the table. For more information,
2780 see `Managing Global Secondary Indexes`_ in the Amazon
2781 DynamoDB Developer Guide .
2782
2783 The table must be in the `ACTIVE` state for UpdateTable to
2784 succeed. UpdateTable is an asynchronous operation; while
2785 executing the operation, the table is in the `UPDATING` state.
2786 While the table is in the `UPDATING` state, the table still
2787 has the provisioned throughput from before the call. The
2788 table's new provisioned throughput settings go into effect
2789 when the table returns to the `ACTIVE` state; at that point,
2790 the UpdateTable operation is complete.
2791
2792 :type attribute_definitions: list
2793 :param attribute_definitions: An array of attributes that describe the
2794 key schema for the table and indexes. If you are adding a new
2795 global secondary index to the table, AttributeDefinitions must
2796 include the key element(s) of the new index.
2797
2798 :type table_name: string
2799 :param table_name: The name of the table to be updated.
2800
2801 :type provisioned_throughput: dict
2802 :param provisioned_throughput: Represents the provisioned throughput
2803 settings for a specified table or index. The settings can be
2804 modified using the UpdateTable operation.
2805 For current minimum and maximum provisioned throughput values, see
2806 `Limits`_ in the Amazon DynamoDB Developer Guide .
2807
2808 :type global_secondary_index_updates: list
2809 :param global_secondary_index_updates:
2810 An array of one or more global secondary indexes for the table. For
2811 each index in the array, you can specify one action:
2812
2813
2814 + Create - add a new global secondary index to the table.
2815 + Update - modify the provisioned throughput settings of an existing
2816 global secondary index.
2817 + Delete - remove a global secondary index from the table.
2818
2819 """
2820 params = {'TableName': table_name, }
2821 if attribute_definitions is not None:
2822 params['AttributeDefinitions'] = attribute_definitions
2823 if provisioned_throughput is not None:
2824 params['ProvisionedThroughput'] = provisioned_throughput
2825 if global_secondary_index_updates is not None:
2826 params['GlobalSecondaryIndexUpdates'] = global_secondary_index_updates
2827 return self.make_request(action='UpdateTable',
2828 body=json.dumps(params))
2829
2830 def make_request(self, action, body):
2831 headers = {
2832 'X-Amz-Target': '%s.%s' % (self.TargetPrefix, action),
2833 'Host': self.host,
2834 'Content-Type': 'application/x-amz-json-1.0',
2835 'Content-Length': str(len(body)),
2836 }
2837 http_request = self.build_base_http_request(
2838 method='POST', path='/', auth_path='/', params={},
2839 headers=headers, data=body, host=self.host)
2840 response = self._mexe(http_request, sender=None,
2841 override_num_retries=self.NumberRetries,
2842 retry_handler=self._retry_handler)
2843 response_body = response.read().decode('utf-8')
2844 boto.log.debug(response_body)
2845 if response.status == 200:
2846 if response_body:
2847 return json.loads(response_body)
2848 else:
2849 json_body = json.loads(response_body)
2850 fault_name = json_body.get('__type', None)
2851 exception_class = self._faults.get(fault_name, self.ResponseError)
2852 raise exception_class(response.status, response.reason,
2853 body=json_body)
2854
2855 def _retry_handler(self, response, i, next_sleep):
2856 status = None
2857 boto.log.debug("Saw HTTP status: %s" % response.status)
2858 if response.status == 400:
2859 response_body = response.read().decode('utf-8')
2860 boto.log.debug(response_body)
2861 data = json.loads(response_body)
2862 if 'ProvisionedThroughputExceededException' in data.get('__type'):
2863 self.throughput_exceeded_events += 1
2864 msg = "%s, retry attempt %s" % (
2865 'ProvisionedThroughputExceededException',
2866 i
2867 )
2868 next_sleep = self._truncated_exponential_time(i)
2869 i += 1
2870 status = (msg, i, next_sleep)
2871 if i == self.NumberRetries:
2872 # If this was our last retry attempt, raise
2873 # a specific error saying that the throughput
2874 # was exceeded.
2875 raise exceptions.ProvisionedThroughputExceededException(
2876 response.status, response.reason, data)
2877 elif 'ConditionalCheckFailedException' in data.get('__type'):
2878 raise exceptions.ConditionalCheckFailedException(
2879 response.status, response.reason, data)
2880 elif 'ValidationException' in data.get('__type'):
2881 raise exceptions.ValidationException(
2882 response.status, response.reason, data)
2883 else:
2884 raise self.ResponseError(response.status, response.reason,
2885 data)
2886 expected_crc32 = response.getheader('x-amz-crc32')
2887 if self._validate_checksums and expected_crc32 is not None:
2888 boto.log.debug('Validating crc32 checksum for body: %s',
2889 response.read())
2890 actual_crc32 = crc32(response.read()) & 0xffffffff
2891 expected_crc32 = int(expected_crc32)
2892 if actual_crc32 != expected_crc32:
2893 msg = ("The calculated checksum %s did not match the expected "
2894 "checksum %s" % (actual_crc32, expected_crc32))
2895 status = (msg, i + 1, self._truncated_exponential_time(i))
2896 return status
2897
2898 def _truncated_exponential_time(self, i):
2899 if i == 0:
2900 next_sleep = 0
2901 else:
2902 next_sleep = min(0.05 * (2 ** i),
2903 boto.config.get('Boto', 'max_retry_delay', 60))
2904 return next_sleep