Hey there, fellow Ruby enthusiast! Ready to supercharge your app with some NoSQL goodness? Let's dive into Amazon DynamoDB, AWS's blazing-fast, fully managed NoSQL database service. We'll be using the aws-sdk-dynamodb
gem to make our lives easier. Trust me, once you get the hang of it, you'll wonder how you ever lived without it!
Before we jump in, make sure you've got:
aws-sdk-dynamodb
gem installed (gem install aws-sdk-dynamodb
)Got all that? Great! Let's roll up our sleeves and get coding.
First things first, let's get our DynamoDB client up and running:
require 'aws-sdk-dynamodb' Aws.config.update({ region: 'us-west-2', credentials: Aws::Credentials.new('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY') }) dynamodb = Aws::DynamoDB::Client.new
Pro tip: In a real-world scenario, you'd want to use environment variables or AWS IAM roles for those credentials. Safety first!
Let's create a table to play with:
dynamodb.create_table({ table_name: 'Movies', key_schema: [ { attribute_name: 'year', key_type: 'HASH' }, { attribute_name: 'title', key_type: 'RANGE' } ], attribute_definitions: [ { attribute_name: 'year', attribute_type: 'N' }, { attribute_name: 'title', attribute_type: 'S' } ], provisioned_throughput: { read_capacity_units: 5, write_capacity_units: 5 } })
Time to add some data:
dynamodb.put_item({ table_name: 'Movies', item: { 'year' => 1994, 'title' => 'Pulp Fiction', 'info' => { 'director' => 'Quentin Tarantino', 'rating' => 8.9 } } })
Let's fetch that item back:
result = dynamodb.get_item({ table_name: 'Movies', key: { 'year' => 1994, 'title' => 'Pulp Fiction' } }) puts result.item
Need to make a change? No problem:
dynamodb.update_item({ table_name: 'Movies', key: { 'year' => 1994, 'title' => 'Pulp Fiction' }, update_expression: 'SET info.rating = :r', expression_attribute_values: { ':r' => 9.0 } })
And if you need to remove something:
dynamodb.delete_item({ table_name: 'Movies', key: { 'year' => 1994, 'title' => 'Pulp Fiction' } })
Want to find all movies from a specific year? Easy peasy:
resp = dynamodb.query({ table_name: 'Movies', key_condition_expression: '#yr = :year', expression_attribute_names: { '#yr' => 'year' }, expression_attribute_values: { ':year' => 1994 } })
Need to search across the entire table? Scan's got your back:
resp = dynamodb.scan({ table_name: 'Movies', filter_expression: 'info.rating > :min_rating', expression_attribute_values: { ':min_rating' => 8.5 } })
Secondary indexes can speed up your queries. Here's how to use them:
resp = dynamodb.query({ table_name: 'Movies', index_name: 'DirectorIndex', key_condition_expression: 'info.director = :director', expression_attribute_values: { ':director' => 'Quentin Tarantino' } })
Need to write a bunch of items at once? Batch write is your friend:
dynamodb.batch_write_item({ request_items: { 'Movies' => [ { put_request: { item: { 'year' => 1994, 'title' => 'The Shawshank Redemption' } } }, { put_request: { item: { 'year' => 1972, 'title' => 'The Godfather' } } } ] } })
And for reading multiple items in one go:
resp = dynamodb.batch_get_item({ request_items: { 'Movies' => { keys: [ { 'year' => 1994, 'title' => 'The Shawshank Redemption' }, { 'year' => 1972, 'title' => 'The Godfather' } ] } } })
Always wrap your DynamoDB operations in begin/rescue blocks:
begin # Your DynamoDB operation here rescue Aws::DynamoDB::Errors::ServiceError => e puts "Couldn't perform operation: #{e.message}" end
For better performance, consider using consistent reads only when necessary, and make good use of batch operations when possible.
For unit testing, you can use the aws-sdk-dynamodb
stubbing capabilities:
dynamodb = Aws::DynamoDB::Client.new(stub_responses: true) dynamodb.stub_responses(:get_item, item: { 'year' => 1994, 'title' => 'Pulp Fiction' })
For integration testing, check out DynamoDB Local. It's a great way to test your code without touching your production data.
And there you have it! You're now equipped to harness the power of DynamoDB in your Ruby applications. Remember, this is just scratching the surface. DynamoDB has a ton of advanced features like transactions, streams, and more. So keep exploring, keep coding, and most importantly, have fun!
Happy coding, Rubyist! 🚀💎