| Index: third_party/gsutil/boto/docs/source/simpledb_tut.rst
|
| diff --git a/third_party/gsutil/boto/docs/source/simpledb_tut.rst b/third_party/gsutil/boto/docs/source/simpledb_tut.rst
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..396072607f68a66d688e521341ebb2aaaa43cd8e
|
| --- /dev/null
|
| +++ b/third_party/gsutil/boto/docs/source/simpledb_tut.rst
|
| @@ -0,0 +1,188 @@
|
| +.. simpledb_tut:
|
| +
|
| +============================================
|
| +An Introduction to boto's SimpleDB interface
|
| +============================================
|
| +This tutorial focuses on the boto interface to AWS' SimpleDB_. This tutorial
|
| +assumes that you have boto already downloaded and installed.
|
| +
|
| +.. _SimpleDB: http://aws.amazon.com/simpledb/
|
| +
|
| +Creating a Connection
|
| +---------------------
|
| +The first step in accessing SimpleDB is to create a connection to the service.
|
| +To do so, the most straight forward way is the following::
|
| +
|
| + >>> import boto
|
| + >>> conn = boto.connect_sdb(aws_access_key_id='<YOUR_AWS_KEY_ID>',aws_secret_access_key='<YOUR_AWS_SECRET_KEY>')
|
| + >>> conn
|
| + SDBConnection:sdb.amazonaws.com
|
| + >>>
|
| +
|
| +Bear in mind that if you have your credentials in boto config in your home
|
| +directory, the two keyword arguments in the call above are not needed. Also
|
| +important to note is that just as any other AWS service, SimpleDB is
|
| +region-specific and as such you might want to specify which region to connect
|
| +to, by default, it'll connect to the US-EAST-1 region.
|
| +
|
| +Creating Domains
|
| +----------------
|
| +Arguably, once you have your connection established, you'll want to create one or more dmains.
|
| +Creating new domains is a fairly straight forward operation. To do so, you can proceed as follows::
|
| +
|
| + >>> conn.create_domain('test-domain')
|
| + Domain:test-domain
|
| + >>>
|
| + >>> conn.create_domain('test-domain-2')
|
| + Domain:test-domain
|
| + >>>
|
| +
|
| +Please note that SimpleDB, unlike its newest sibling DynamoDB, is truly and completely schema-less.
|
| +Thus, there's no need specify domain keys or ranges.
|
| +
|
| +Listing All Domains
|
| +-------------------
|
| +Unlike DynamoDB or other database systems, SimpleDB uses the concept of 'domains' instead of tables.
|
| +So, to list all your domains for your account in a region, you can simply do as follows::
|
| +
|
| + >>> domains = conn.get_all_domains()
|
| + >>> domains
|
| + [Domain:test-domain, Domain:test-domain-2]
|
| + >>>
|
| +
|
| +The get_all_domains() method returns a :py:class:`boto.resultset.ResultSet` containing
|
| +all :py:class:`boto.sdb.domain.Domain` objects associated with
|
| +this connection's Access Key ID for that region.
|
| +
|
| +Retrieving a Domain (by name)
|
| +-----------------------------
|
| +If you wish to retrieve a specific domain whose name is known, you can do so as follows::
|
| +
|
| + >>> dom = conn.get_domain('test-domain')
|
| + >>> dom
|
| + Domain:test-domain
|
| + >>>
|
| +
|
| +The get_domain call has an optional validate parameter, which defaults to True. This will make sure to raise
|
| +an exception if the domain you are looking for doesn't exist. If you set it to false, it will return a
|
| +:py:class:`Domain <boto.sdb.domain.Domain>` object blindly regardless of its existence.
|
| +
|
| +Getting Domain Metadata
|
| +------------------------
|
| +There are times when you might want to know your domains' machine usage, aprox. item count and other such data.
|
| +To this end, boto offers a simple and convenient way to do so as shown below::
|
| +
|
| + >>> domain_meta = conn.domain_metadata(dom)
|
| + >>> domain_meta
|
| + <boto.sdb.domain.DomainMetaData instance at 0x23cd440>
|
| + >>> dir(domain_meta)
|
| + ['BoxUsage', 'DomainMetadataResponse', 'DomainMetadataResult', 'RequestId', 'ResponseMetadata',
|
| + '__doc__', '__init__', '__module__', 'attr_name_count', 'attr_names_size', 'attr_value_count', 'attr_values_size',
|
| + 'domain', 'endElement', 'item_count', 'item_names_size', 'startElement', 'timestamp']
|
| + >>> domain_meta.item_count
|
| + 0
|
| + >>>
|
| +
|
| +Please bear in mind that while in the example above we used a previously retrieved domain object as the parameter, you
|
| +can retrieve the domain metadata via its name (string).
|
| +
|
| +Adding Items (and attributes)
|
| +-----------------------------
|
| +Once you have your domain setup, presumably, you'll want to start adding items to it.
|
| +In its most straight forward form, you need to provide a name for the item -- think of it
|
| +as a record id -- and a collection of the attributes you want to store in the item (often a Dictionary-like object).
|
| +So, adding an item to a domain looks as follows::
|
| +
|
| + >>> item_name = 'ABC_123'
|
| + >>> item_attrs = {'Artist': 'The Jackson 5', 'Genera':'Pop'}
|
| + >>> dom.put_attributes(item_name, item_attrs)
|
| + True
|
| + >>>
|
| +
|
| +Now let's check if it worked::
|
| +
|
| + >>> domain_meta = conn.domain_metadata(dom)
|
| + >>> domain_meta.item_count
|
| + 1
|
| + >>>
|
| +
|
| +
|
| +Batch Adding Items (and attributes)
|
| +-----------------------------------
|
| +You can also add a number of items at the same time in a similar fashion. All you have to provide to the batch_put_attributes() method
|
| +is a Dictionary-like object with your items and their respective attributes, as follows::
|
| +
|
| + >>> items = {'item1':{'attr1':'val1'},'item2':{'attr2':'val2'}}
|
| + >>> dom.batch_put_attributes(items)
|
| + True
|
| + >>>
|
| +
|
| +Now, let's check the item count once again::
|
| +
|
| + >>> domain_meta = conn.domain_metadata(dom)
|
| + >>> domain_meta.item_count
|
| + 3
|
| + >>>
|
| +
|
| +A few words of warning: both batch_put_attributes() and put_item(), by default, will overwrite the values of the attributes if both
|
| +the item and attribute already exist. If the item exists, but not the attributes, it will append the new attributes to the
|
| +attribute list of that item. If you do not wish these methods to behave in that manner, simply supply them with a 'replace=False'
|
| +parameter.
|
| +
|
| +
|
| +Retrieving Items
|
| +-----------------
|
| +To retrieve an item along with its attributes is a fairly straight forward operation and can be accomplished as follows::
|
| +
|
| + >>> dom.get_item('item1')
|
| + {u'attr1': u'val1'}
|
| + >>>
|
| +
|
| +Since SimpleDB works in an "eventual consistency" manner, we can also request a forced consistent read (though this will
|
| +invariably adversely affect read performance). The way to accomplish that is as shown below::
|
| +
|
| + >>> dom.get_item('item1', consistent_read=True)
|
| + {u'attr1': u'val1'}
|
| + >>>
|
| +
|
| +Retrieving One or More Items
|
| +----------------------------
|
| +Another way to retrieve items is through boto's select() method. This method, at the bare minimum, requires a standard SQL select query string
|
| +and you would do something along the lines of::
|
| +
|
| + >>> query = 'select * from `test-domain` where attr1="val1"'
|
| + >>> rs = dom.select(query)
|
| + >>> for j in rs:
|
| + ... print 'o hai'
|
| + ...
|
| + o hai
|
| + >>>
|
| +
|
| +This method returns a ResultSet collection you can iterate over.
|
| +
|
| +Updating Item Attributes
|
| +------------------------
|
| +The easiest way to modify an item's attributes is by manipulating the item's attributes and then saving those changes. For example::
|
| +
|
| + >>> item = dom.get_item('item1')
|
| + >>> item['attr1'] = 'val_changed'
|
| + >>> item.save()
|
| +
|
| +
|
| +Deleting Items (and its attributes)
|
| +-----------------------------------
|
| +Deleting an item is a very simple operation. All you are required to provide is either the name of the item or an item object to the
|
| +delete_item() method, boto will take care of the rest::
|
| +
|
| + >>>dom.delete_item(item)
|
| + >>>True
|
| +
|
| +
|
| +
|
| +Deleting Domains
|
| +-----------------------------------
|
| +To delete a domain and all items under it (i.e. be very careful), you can do it as follows::
|
| +
|
| + >>> conn.delete_domain('test-domain')
|
| + True
|
| + >>>
|
|
|