MongoDB ve Python

Gbmdpof

Kıdemli Üye
23 Eyl 2016
2,001
11
[COLOR="WhiteKlasik veritabanı sistemleri bazen bize oldukça sıkıntı oluşturabiliyor, bazı küçük işlemler için bile tüm veritabanı yapısını değiştirmemiz gerekebiliyor. Bu durumlarda ise NoSQL bize oldukça kolaylık sağlıyor. Kısaca bahsetmek gerekirse NoSQL, SQL'den farklı bir şekilde verileri saklar. Bu NoSQL veritabanı türüne göre JSON, anahtar-değer, vs. olabilir. Ayrıca NoSQL'de her kayıt, aynı türden olmak zorunda değil. Bu da bize oldukça esnek ve rahat bir kullanım sağlıyor. NoSQL'in diğer güzelliği ise SQL'de katı şema kurallarına uymak gerekirken NoSQL'de böyle şeylere bağlı olmamız gerekmiyor. Bunlar dışında tabii birçok farklılık var fakat bunlar bilmeniz gereken birkaç önemli farklılıklardan birkaçı.

Siz, kendi durumunuza göre en uygun veritabanı türünü ikisinin de avantajlarını ve dezavantajlarını göze alarak seçmelisiniz. Burada NoSQL ne kadar güzel gözükse de bazı durumlarda SQL'e de ihtiyacınız olacak.

NoSQL'in bir diğer güzel yönü de farklı senaryolarda kullanabileceğiniz farklı veritabanı türlerine sahip olması:

[LIST]
[*][COLOR="Red [URL="https://tik.lat/rUzio"] DynamoDB[/URL]
[*][COLOR="red [URL="https://tik.lat/odxxI"] CouchDB[/URL], MongoDB, RethinkDB
[*][COLOR="Red [URL="https://tik.lat/FsKcC"] Cassandra[/URL]
[*][COLOR="red [URL="https://tik.lat/ieAfb"] Redis[/URL]
[/LIST]
Bunlar dışında birkaç tane daha var, fakat bunlar en yaygın kullanılanlar.

[COLOR="Red [URL="https://tik.lat/1vfCN"] PyMongo[/URL] adında bir kütüphane kullanacağız. Biz burada birkaç örnek üzerinden gideceğiz ama eğer daha fazla şey öğrenmek isterseniz, dökümantasyonlarına bakabilirsiniz.

İlk önce PyMongo'yu pip ile kuralım:
Kod:
pip install pymongo

Kurduğunuza göre her şeyin doğru olup olmadığına bakmak için Python shelli üzerinden PyMongo'yu import edelim:
Kod:
>>> import pymongo

Eğer bir hata olmadan çalışıyorsa her şey tamam demektir.

Sonrasında ise MongoDB'nin asıl veritabanını kurmanız gerek. Bunun her sistem için açıklamalarını yazmayacağım. Kendi sitelerinde zaten var. Buraya tıklayarak nasıl indirileceğinizi anlatan yazılarına gidebilirsiniz.

Ben Ubuntu üzerinde ilk komutta hata aldım, aynı hatayı alan varsa onun yerine bu komutu kullanabilirler:
Kod:
curl https://www.mongodb.org/static/pgp/server-3.4.asc | sudo apt-key add -

İndirdikten sonra, mongod komutu ile Mongo daemon'u başlatın.

Şimdi öncelikle Python'da MongoClient nesnesi ile bağlantıyı kuralım. Bunun için pymongo'dan MongoClient'ı import etmeliyiz. Bunu, bağlantıyı kurmak için kullanacağız:
Kod:
from pymongo import MongoClient
client = MongoClient()

Bu kod ile, varsayılan sunucu ve porta (localhost, 27017) bağlanacaksınız. Ayrıca aşağıdaki şekilde kullanarak bunu değiştirebilirsiniz.
Kod:
client = MongoClient('localhost', 27017)

Veya Mongo URI formatını da kullanabilirsiniz:
Kod:
client = MongoClient('mongodb://localhost:27017')

Bunların hepsi aynı şeyi yapıyor, istediğinizi kullanabilirsiniz.

MongoClient ile bağlandığınıza göre istediğiniz veritabanına bağlanabilirsiniz. Veritabanı adını attribute kullanarak belirtebilirsiniz:
Kod:
db = client.pymongo_test

Veya dict kullanıyormuş gibi de erişebilirsiniz:
Kod:
db = client['pymongo_test']

Ayrıca bağlandığınız veritabanının var olup olmaması önemli değil. Veritabanı adı belirtip, oraya veri kaydederek otomatik olarak veritabanı oluşturuyorsunuz zaten.

MongoDB ile veritabanınıza veri eklemek, oldukça kolaydır. Bu örnekte, posts kolleksiyonuna yeni bir post ekleyelim.

Kod:
posts  = db.posts
post_data = {
    'title': 'MongoDB ve Python',
    'content': 'PyMongo <3',
    'author': 'Gbmdpof'
}

result = posts.insert_one(post_data)
print('One post: {0}'.format(result.inserted_id))

Bir komut ile birden fazla döküman ekleceksek, insert_one()'dan daha hızlı olarak insert_many() kullanabiliriz.

Kod:
post_1 = {
    'title': 'Python and MongoDB',
    'content': 'PyMongo is fun, you guys',
    'author': 'Scott'
}
post_2 = {
    'title': 'Virtual Environments',
    'content': 'Use virtual environments, you guys',
    'author': 'Scott'
}
post_3 = {
    'title': 'Learning Python',
    'content': 'Learn Python, it is easy',
    'author': 'Bill'
}
new_result = posts.insert_many([post_1, post_2, post_3])
print('Multiple posts: {0}'.format(new_result.inserted_ids))

Bu kodları çalıştırınca, buna benzer bir çıktı almış olmanız lazım:
Kod:
One post: 5b76a0ba96bb303828d8bbd2
Multiple posts: [
ObjectId('5b76a0ba96bb303828d8bbd3'), 
ObjectId('5b76a0ba96bb303828d8bbd4'), 
ObjectId('5b76a0ba96bb303828d8bbd5')
]

Veri almak da aynı veri girmek kadar kolay. Bunda da find_one() metodunu kullanıyoruz. Burada kullanacağımız argüman, bulunacak alanları içeren bir dict. Aşağıdaki örnekte Gbmdpof tarafından yazılmış yazıyı bulacağız.

Kod:
gbmdpofs_post = posts.find_one({'author': 'Gbmdpof'})
print(gbmdpofs_post)

Bu, bu çıktıyı vermiş olmalı:
Kod:
{
'_id': ObjectId('5b76a00296bb30379f7603d6'),
'title': 'MongoDB ve Python',
'content': 'PyMongo <3',
'author': 'Gbmdpof'
}

Göreceksiniz ki, post'un ObjectId'si _id keyinin altında saklanıyor. Bu benzersin değeri, ileride o girdiyi bulmak için kullanabilirsiniz. Eğer birden çok döküman almak istersek ise, find() metodunu kullanıyoruz. Bu sefer Scott tarafından yazılmış tüm postları alalım.

Kod:
scotts_posts = posts.find({'author': 'Scott'})
print(scotts_posts)

Çalıştırınca:
Kod:
<pymongo.cursor.Cursor object at 0x109852f98>

Bunda, bir array döndürmedi. Bunun yerine Cursor nesnesinden döndürdü. Bu Cursor, birkaç yardımcı metod içeren iterable bir nesnedir. Her dökümanı almak için, for döngüsü ile itarate etmemiz yeterli:
Kod:
for post in scotts_posts:
    print(post)

Bu konuda basit PyMongo ve MongoDB'den bahsettik ve basit işlemleri yaptık. MongoDB ve PyMongo hakkında daha fazla şey öğrenmek isterseniz, kendi sitelerindeki resmi dökümantasyonuna bakabilirsiniz.
[/COLOR]
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.