Bu derste DynamoDB ile veri ekleme ve alma konusunda bazı basit örneklerin üzerinden geçeceksiniz. DynamoDB tablonuzu CreateTable API’sini kullanarak oluşturur ve ardından BatchWriteItem API çağrısını kullanarak bazı ögeler eklersiniz. Son olarak GetItem API çağrısını kullanarak ögeleri ayrı ayrı alırsınız. Siz bu örnekleri ayrıntılı bir biçimde incelemeden önce örnek çevrimiçi kitapçı uygulamanızda kullanılacak veri modeli üzerinde fikir alışverişinde bulunacağız.

Takip eden modüllerde Sorgulama API çağrısını kullanarak birden fazla ögeyi tek seferde nasıl alacağınızı ve ikincil dizinleri kullanarak ek sorgu modellerini nasıl etkinleştireceğinizi öğreneceksiniz. Ayrıca, tablonuzdaki mevcut ögeleri nasıl güncelleyeceğinizi de göreceksiniz.

Modülü Tamamlama Süresi: 15 Dakika


Aşağıdaki DynamoDB kavramları bu modülde kilit rol oynamaktadır:

  • Tablo: DynamoDB veri kayıtlarından oluşan bir koleksiyon.
  • Öğe: Bir DynamoDB tablosundaki tek bir veri kaydı. Bu, ilişkisel veritabanında yer alan bir satıra benzetilebilir.
  • Öznitelik: Bir öğede bulunan tek bir veri unsuru. Bu, ilişkisel veritabanında yer alan bir sütuna benzetilebilir. Bununla birlikte, ilişkisel veritabanlarında bulunan sütunların aksine bu modülün ilerleyen kısımlarında ele alınacak birincil anahtar hariç olmak üzere tablo oluşturulurken özniteliklerin belirtilmesine gerek yoktur. Öznitelikler dize, tamsayı veya Boolean gibi basit türler olabileceği gibi liste veya harita gibi karmaşık türler de olabilir.
  • Birincil anahtar: Birincil anahtar bir DynamoDB tablosunda yer alan tek bir ögeye ait benzersiz tanımlayıcıdır. Birincil anahtar adının ve türünün tablo oluşturulurken belirtilmesi ve belirtilen türden birincil anahtarın bir tabloya yazılan her öğeye dâhil edilmesi gerekir. Tek bir birincil anahtar tek bir öznitelikten, birleşik bir birincil anahtar ise bir bölüm anahtarı ve bir sıralama anahtarı olmak üzere iki öznitelikten oluşur. Örneğin, tanımlayıcı olarak “UserID” kullanarak tek bir birincil anahtar veya öğe tanımlayıcısı olarak “UserID” ile “Creation_Date” öğelerini birlikte kullanarak bir birleşik anahtar oluşturabilirsiniz.

Bir uygulama geliştirirken her zaman uygulama mantığınızda ihtiyaç duyulacak veri modellerini tasarlamaya yeterince zaman ayırmalısınız. Bu veri modeli tasarımında uygulamanızda verileri hem okumak hem de yazmak için gerekli olacak veri erişim ihtiyaçları göz önünde bulundurulmalıdır.

DynamoDB ilişkisel olmayan bir veritabanıdır. İlişkisel olmayan veritabanlarında tablo oluştururken şemanın tamamını önceden belirtmenize gerek yoktur. Sadece tablonuzdaki her kaydı benzersiz olarak tanımlayan tablonuzun birincil anahtarını bildirmeniz yeterlidir. Uygulamanızın ihtiyaçları değiştiğinde şemanız üzerinde kolaylıkla değişiklik yapabileceğiniz için bu özellik önceden maruz kalacağınız veri modeli tasarım maliyetini azaltır.

Bu öğreticinin “Giriş” kısmındaki “Uygulama arka planı” bölümünde bahsedildiği üzere uygulamanızın belirli bir kitabı başlığına ve yazarına göre alması gerekir. Başlık-yazar kombinasyonu bir kitabın benzersiz tanımlayıcısı olduğundan bu öznitelikleri tablonuzun birincil anahtarı olarak kullanabilirsiniz. Uygulamanızın ayrıca envanter sisteminizde yer alan öğe numaraları ile eşleşecek şekilde kitabınızın kategorisi (tarih veya biyografi gibi) ve kitabınızın bulunduğu biçimler (ciltli, karton kapaklı veya sesli kitap gibi) hakkındaki bilgileri de depolaması gerekir.

Bu ihtiyaçları aklınızdan çıkarmayarak tablonuz için aşağıdaki şemayı kullanabilirsiniz:

  • Başlık (bir dize): Kitabın başlığı
  • Yazar (bir dize): Kitabın yazarı
  • Kategori (bir dize): Tarih, biyografi ve bilim-kurgu gibi kitabın kategorisi
  • Biçimler (bir harita): Satışa sunduğunuz farklı biçimler (ciltli, karton kapaklı ve sesli kitap gibi) ve bunların envanter sisteminizdeki öğe numaraları

Takip eden adımlarda tablonuzun birleşik birincil anahtarını (Yazar ve Başlık) belirterek tabloyu oluşturursunuz. Ardından, tablonuza birtakım öğeler yükleyip tablodan ayrı ayrı öğeleri okursunuz.


  • 1. Adım. DynamoDB tablosu oluşturun

    İndirdiğiniz dizin CreateTable API’sini kullanarak Kitaplar tablosu oluşturan bir create_table.py betiği içerir. Aşağıdaki komutu AWS Cloud9 terminaline girerek bu betiği çalıştırabilirsiniz.

    $ python create_table.py

    create_table.py betiğini AWS Cloud9 düzenleyicisi ile açtığınızda şunu görmeniz gerekir:

    • Betik, tablonuzun birleşik birincil anahtarını CreateTable API çağrısındaki KeySchema bağımsız değişkeni ile belirtir. Tablonuz Author öğesini karma anahtar olarak, Title öğesini ise aralık anahtarı olarak kullanır.
    • Betik, tablonuzun tedarik edilen aktarım hızını hem okuma kapasitesi birimlerini hem de yazma kapasitesi birimlerini tanımlayarak belirtir. DynamoDB, okuma ve yazma kapasitesini ayrı ayrı ayarlamanızı sağlayarak yüksek maliyetli aşırı tedariğe gerek duymadan yapılandırmanız üzerinde uygulama ihtiyaçlarınıza uygun ince ayarları yapmanıza olanak tanır.
  • 2. Adım. Ögeleri tabloya yükleyin

    Bu adımda tabloya bazı kitaplar yüklersiniz. AWS Cloud9 terminalinde aşağıdaki komutu çalıştırın.
    $ python insert_items.py
    Bu komut aşağıdaki betiği çalıştırır.
    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    with table.batch_writer() as batch:
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Rainmaker",
            "Category": "Suspense", "Formats": { "Hardcover": "J4SUKVGU", "Paperback": "D7YF4FCX" } })
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Firm",
            "Category": "Suspense", "Formats": { "Hardcover": "Q7QWE3U2",
            "Paperback": "ZVZAYY4F", "Audiobook": "DJ9KS9NM" } })
        batch.put_item(Item={"Author": "James Patterson", "Title": "Along Came a Spider",
            "Category": "Suspense", "Formats": { "Hardcover": "C9NR6RJ7",
            "Paperback": "37JVGDZG", "Audiobook": "6348WX3U" } })
        batch.put_item(Item={"Author": "Dr. Seuss", "Title": "Green Eggs and Ham",
            "Category": "Children", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
        batch.put_item(Item={"Author": "William Shakespeare", "Title": "Hamlet",
            "Category": "Drama", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
    

    Önceki betiğin gösterdiği üzere tabloya beş kitap yüklemek için BatchWriteItem API’sini kullandınız. Her kitap birincil anahtar için Author ve Title özniteliklerini, kitaplar hakkında ek bilgiler için ise Category ve Formats özniteliklerini içerir. Her özniteliğin bir türü vardır. Bunlar, Category özniteliğine yönelik bir dize gibi basit tür veya Formats özniteliğine yönelik harita gibi karmaşık tür olabilir.

    Boto 3 istemci kitaplığını kullanarak bir HTTP API’si üzerinden veri eklediğinizi gözden kaçırmayın. Tüm veri erişim ve değişiklik istekleri ilişkisel veritabanı yönetim sistemlerinde yaygın olarak kullanılan veritabanına kalıcı bağlantı sağlama yöntemi yerine HTTP istekleri aracılığıyla yapılır.

  • 3. Adım. Tablodan öğe alın

    GetItem API isteğini kullanarak ve istediğiniz öğenin birincil anahtarını belirterek tek bir kitabı alabilirsiniz.

    AWS Cloud9 terminalinde aşağıdaki komutu çalıştırın.

    $ python get_item.py

    Bu komut, aşağıdaki betiği çalıştırarak tek bir öğeyi, bizim örneğimizde John Grisham’ın The RainMaker adlı kitabını alır.

    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    resp = table.get_item(Key={"Author": "John Grisham", "Title": "The Rainmaker"})
    
    print(resp['Item'])

    Terminalinizin tablodan alınan tüm kitap verilerini yazdırması gerekir.

    $ python get_item.py
    {'Title': 'The Rainmaker', 'Formats': {'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}

    Bir tabloda yer alan her öğe kendi birincil anahtarı ile benzersiz olarak tanımlandığı için GetItem API çağrısı daima tablonuzdan en fazla bir öğe getirecektir.


    Bir sonraki modülde DynamoDB tablosundan tek bir API çağrısıyla nasıl birden fazla öge alabileceğinizi öğreneceksiniz. Ayrıca, ikincil dizinleri kullanarak tablonuzda birden fazla veri erişim modelini nasıl etkinleştirebileceğinizi de öğreneceksiniz.