D ile günlük

MongoDB veri okumak ve yazmak

Bu makalede MongoDB ile veri okuyup yazmayı anlatacağız.

MongoDB veri okumak ve yazmak

Bir önceki makalede MongoDB veritabanına nasıl bağlanabileceğimizden bahsetmiştik.

Bu derste D ile veritabanına veri yazmayı ve okumayı öğreneceğiz.

Kiraz dizininde iken kaynak dosyamız olan app.d kütügünü bir metin düzenleyici ile açıyoruz.

$ emacs source/app.d

İçindeki kaynak kodu değiştiriyoruz.

import vibe.vibe;
import vibe.db.mongo.mongo;

struct Kullanıcı
{
    @name("_id") int no;
    string isim;
    string şifre;
}

void günlüğeYaz (HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    logInfo("Veritabanına bağlanıyorum...");
    auto veritabanı = connectMongoDB("localhost").getDatabase("kiraz");
    auto kullanıcılar = veritabanı["kullanıcılar"];

    logInfo("Veri ekliyorum...");
    Kullanıcı ali;
    ali.no = 2;
    ali.isim = "Ali";
    ali.şifre = "azgizli";
    kullanıcılar.insert(ali);

    yanıt.writeBody("İşlembaşarılı");

}

void günlük (HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    logInfo("Veritabanına bağlanıyorum...");

    auto veritabanı = connectMongoDB("localhost").getDatabase("kiraz");
    auto kullanıcılar = veritabanı["kullanıcılar"];

    logInfo("Veritabanındaki tüm kayıtları gösteriyorum...");

    auto sonuç = kullanıcılar.find();

    foreach (i, kayıt; sonuç.byPair)
        logInfo("Kayıt %d: %s", i, kayıt.toJson().toString());

    yanıt.writeBody("İşlem başarılı");
}

void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/günlük", &günlük);
    yolAtayıcı.get("/günlük/yaz", &günlüğeYaz);

    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8080;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Kaynak kodu incelediğinizde önceki dersten farklı olarak günlüğeYaz bölümünün eklendiğini görebilirsiniz.

Burada vibed kütüphanesinin güzel bir özelliği D yapılarını MongoDB'nin veri yapısı olan BSON biçimine kolaylıkla çevirebiliyor.

Oluşturduğumuz kaydı tekrar gözümüzün önüne getirelim.

{
    "_id" : 1,
    "isim" : "Erdem",
    "şifre" : "çokgizli"
}

D ile basit bir yapı oluşturup, bu yapının içini doldurduktan sonra kolaylıkla kaydedebiliyoruz.

Denemedim ama bu yapının da çalışması lazım. Eğer isterseniz siz deneyebilirsiniz.

struct Kullanıcı
{
    int _id;
    string isim;
    string şifre;
}

Buradaki _id alanı için takma bir isim oluşturmak istersek

@name("_id") int no;

şeklindeki kullanımla, _id isimli alana no takma ismini vermiş oluyoruz.

Gördüğünüz gibi Kullanıcı türünde ali isimli bir yapı oluşturduk. Bunların isim, no, şifre alanlarına bazı değerler verdikten sonra

kullanıcılar.insert(ali);

şeklinde veritabanına kayıt yaptık.

Dikkat ederseniz kayıtların gösterildiği günlük bölümünde de bazı değişiklikler var.

auto sonuç = kullanıcılar.find();

Yukarıdaki gibi kullanıcılar.find() şeklinde bir kullanımla veritabanındaki tüm kayıtlara nasıl kolaylıkla erişebildiğimize dikkat ediniz.

$ dub

komutu vererek yazdığımız programı derleyip, çalıştıralım.

Öncelikle sadece günlük alanına bakalım.

Tarayıcınızla http://localhost:8080/günlük adresini açınız.

Günlük çıktısına baktığımızda sadece bir tane kayıt olduğunu görebilirsiniz.

Bu sefer tarayıcınızla http://localhost:8080/günlük/yaz adresini açınız.

Eğer işlem başarılı oldu ise işlemin başarılı olduğuna dair bir ileti görmelisiniz.

Tekrar günlük adresini açınız.

Bu sefer iki tane kayıt olduğunu görebilirsiniz.

MongoDB veritabanı kayıt okuma ve yazma

MongoDB birden fazla kayıt ekleme

Programı yazdık ama bir eksiklik var.

Eğer tekrar günlüğe kayıt eklediğimiz adresi açıp, kayıt eklemeye çalışırsanız yazılım bir hata verecek.

Bunun nedeni her kaydın numarasını tutan _id alanının benzersiz olması gerekiyor.

O zaman kullanıcı isimli yapıdan sonra D'nin rastgele sayı üreten kütüphanesini ekliyorum.

import std.random:uniform;

Günlüğe yaz kısmında kullanıcıya numara verdiğimiz kısmı da aşağıdaki gibi değiştiriyorum.

ali.no = uniform(3, 39876);

uniform(başlangıç, bitiş) şeklinde bir kullanım belirttiğimiz başlangıç ve bitiş aralığında rastgele bir sayı üretiyor.

İsterseniz yazdığımız programda sadece bu şekilde bir değişiklik yapıp deneyebilirsiniz.

Bu dersi hazırlarken D'nin ileri düzey olanaklarına çok fazla girmeden, kolay anlaşılır bir yazı dizisi hazırlamayı düşündüm.

Yazılımda biraz değişiklikler yapacağız ve biraz D dilinin özelliklerinden faydalanacağız.

Tekrar app.d kütüğünü aşağıdaki gibi değiştiriniz.

import vibe.vibe;
import vibe.db.mongo.mongo;
import std.random:uniform;
import std.conv:to;

struct Kullanıcı
{
    @name("_id") int no;
    string isim;
    string şifre;
}

void günlüğeYaz (HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    logInfo("Veritabanına bağlanıyorum...");
    auto veritabanı = connectMongoDB("localhost").getDatabase("kiraz");
    auto kullanıcılar = veritabanı["kullanıcılar"];

    logInfo("Veri ekliyorum...");
    Kullanıcı ali;
    ali.no = uniform(3, 39876);

    enum İsimler { Ali, Veli, Ahmet, Ayşe, Irmak, Hasan }
    enum Şifreler { çokgizli, azgizli, gizlideğil }

    ali.isim = to!string(uniform!İsimler);
    ali.şifre = to!string(uniform!Şifreler);
    kullanıcılar.insert(ali);

    yanıt.writeBody("İşlembaşarılı");

}
void günlük (HTTPServerRequest istek, HTTPServerResponse yanıt)
{
    logInfo("Veritabanına bağlanıyorum...");

    auto veritabanı = connectMongoDB("localhost").getDatabase("kiraz");
    auto kullanıcılar = veritabanı["kullanıcılar"];

    logInfo("Veritabanındaki tüm kayıtları gösteriyorum...");

    auto sonuç = kullanıcılar.find();

    foreach (i, kayıt; sonuç.byPair)
        logInfo("Kayıt %d: %s", i, kayıt.toJson().toString());

    yanıt.writeBody("İşlem başarılı");
}


void main()
{
    auto yolAtayıcı = new URLRouter;
    yolAtayıcı.get("/günlük", &günlük);
    yolAtayıcı.get("/günlük/yaz", &günlüğeYaz);

    auto ayarlar = new HTTPServerSettings;
    ayarlar.port = 8080;
    ayarlar.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(ayarlar, yolAtayıcı);

    logInfo("Lütfen tarayıcınızla http://127.0.0.1:8080/ adresini açınız.");
    runApplication();
}

Burada yaptığımız değişikliklere bakacak olursak

import std.random:uniform;
import std.conv:to;

şeklinde bir kullanımla kullanmak istediğimiz uniform ve to işlevleri için gerekli kütüphane dosyalarını ekledik.

İstese idik burada

import std.random;
import std.conv;

şeklinde de kütüphane dosyalarını ekleyebilirdik.

İkisinin farkı şudur.

std.random şeklindeki kullanımda ben bu kütükteki tüm işlevleri kullanmak istiyorum diyorsunuz. std.random:uniform şeklindeki kullanımda ise bu kütükten sadece uniform işlevini kullanacağınızı belirtiyorsunuz.

D'de kullanıcı tanımlı türleri enum anahtar kelimesi ile tanımlıyoruz.

enum Meyveler { Elma, Armut, Portakal, Çilek, Ayva, Erik }

Örneğin uniform!Meyveler şeklindeki bir kullanım bu meyvelerden bir tanesini seçecek.

Bu meyve kullanıcı tanımlı bir tür olduğu için bunu tekrar to!string() işlevi ile dizgeye çevirmemiz gerekiyor.

Bu to! nun yanındaki ! ise bu işlevin bir şablon olduğunu gösteriyor. Yani bu işlevin farklı türlerle de çalışabildiğini anlatıyor.

Örneğin to!int(42.0) şeklindeki bir kullanım 42.0 sayısını double türünden int e çevirir. Alacağımız sonuç tamsayı türünde 42 olur.

Bu açıklamalardan sonra artık uygulamamızı çalıştırabiliriz.

Kaynak kütüğü değiştirdikten sonra kiraz dizinindeyken

$ dub

komutunu veriyoruz.

Bir kaç tane kayıt eklemek için tarayıcınızla http://localhost:8080/günlük/yaz adresini açın. Sayfayı bir kaç kere yenileyin.

Eklenen kayıtların ekran görüntüsünü görebilirsiniz.

MongoDB rastgele kayıt eklemek

Veritabanı biçiminde gösterimde ise eklenen kayıtlar şu şekilde oldu.

/* 1 */
{
    "_id" : 1,
    "isim" : "Erdem",
    "şifre" : "çokgizli"
}

/* 2 */
{
    "_id" : 2,
    "isim" : "Ali",
    "şifre" : "azgizli"
}

/* 3 */
{
    "_id" : 34357,
    "isim" : "Ahmet",
    "şifre" : "çokgizli"
}

/* 4 */
{
    "_id" : 32912,
    "isim" : "Hasan",
    "şifre" : "çokgizli"
}

/* 5 */
{
    "_id" : 33252,
    "isim" : "Veli",
    "şifre" : "azgizli"
}

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.