Python- MySQL fikir alma ... (Bir aceminin sorusu...)

Başlatan okkangal, 20 Şubat 2014 - 10:37:20

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

okkangal

Python ile kendi halimde denemeler  yapamaktayım .  Şimdi aşağıdaki kodlarda, localhost'da   id,ad,soyad verileri olan okdata isimli bir database var . Veriler okdata içerisinde liste isimli bir tabloda ....



#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pymysql


host = "localhost"
kullaniciadi = "root"
sifre = "1234"
databaseadi ="okdata"

#kisi_adi = raw_input("Bir isim giriniz  :")
#kisi_soyadi = raw_input("Soyadınızı giriniz  :")


conn = pymysql.connect(host,kullaniciadi,sifre,databaseadi)
cur = conn.cursor()


#cur.execute("INSERT INTO liste (ad,soyad) VALUES ('"+kisi_adi+"','"+kisi_soyadi+"')")
#conn.commit()

cur.execute("SELECT * FROM liste WHERE id='2'")

veri = cur.fetchall()

print(veri)

# for i in veri :
# for k in i :
# print(k)


Burada database den id = 2 olan veriyi çekiyorum .. id = 2 olan veri ((2, 'Erhan', 'Cinar'),) şeklinde bir demet olarak veri değişkenine yükleniyor . Bura da iç içe iki demet mevcut . Yani  veri[0]  yine bir demet .

Burada çektiğim verileri birer değişkene atayarak kullanabilirim ama bu küçük bir tablo ve her kayıt için sadece üç veri barındırmakta . Daha büyük bir tabloda bunu manuel olarak ayarlamak zor . Acaba bu fetchall işleminden sonra , veriyi kullanmak için ne tür algoritmalar veya ne çeşit kodlamalar kullanılmakta ... Vakti olan ve ilgili arkadaşlar dan bir kaç tavsiye alabilirmiyim acaba .... İlgilenen herkese şimdiden teşekkürler ....



sem

Aslında size verilen veri yapısı bence gayet kullanışlı. Tabi bu işin bencesi. Kullandığım bir sistemi Python + MySQL... Şimdi tam anımsayamıyorum fakat sizin yazdığınızdan da görüldüğü üzere, her bir satır tuple olarak modellenmiş görünüyor. Bu nedenle veri[0] bir tuple çünkü burada bir satırlık veri tutuluyor.

Alışıla gelmiş yöntemlerden birisi de kolon adına göre verileri çekmek aslında bu gibi işlemler. Python'da var mıdır diye araştırdığımda olduğunu görüyorum (bu kadar destek alan bir dil için şaşırmadım elbet =))

http://stackoverflow.com/questions/10195139/how-to-retrieve-sql-result-column-value-using-column-name-in-python


Buradan güzel bir örnek kod inceleyebilirsiniz. Özetle;

result_set = cursor.fetchall()

satırı ile veri tabanından veriler alınmış. Daha sonradan veri for döngüsü ile iterasyon sayesinde alınmış;

for row in result_set:

Burada önemli nokta, her bir iterasyonda result_set içerisindeki tek bir satırlık veri okunuyor. Okunan veriden ise tablodaki kolon isimleri ile veriler alınmış;

row["name"], row["category"]

Yani buradan kişinin sorgu attığı tablo olan animal tablosunda name ve category isminde iki tane sütun/field/alan (ne şekilde nitelemek isterseniz) bulunduğunu anlayabilirsiniz. Sizin örneğiniz için ise

row["ad"] ya da row["soyad"] şeklinde veriye erişebilmeniz gerekli. MySQL for Python isminde bir modül kullanılmış, buna bakmanız yeterli olacak görünüyor bu şekilde erişim sağlayabilmek için.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

okkangal

Sn. sem ilginiz ve yorumunuz için teşekkür ederim . konu ile ilgili denemelere devam ediyorum ve sizin önerilerinizi de deneyeceğim.
Benim sıkıntım , çektiğimiz verinin tuple içerisinde bir başka tuple şeklinde olması . Ben bu kolon isimleri ile veri çekme konusunda pek açıklayıcı bir belge bulamamıştım. Bende aslında bu yöntem  üzerinden denemeler yapmak istiyorum . Yoksa diğer şekilde büyük tablolarda kafa çok karışıyor.

sem

Dediğiniz gibi kolon isimleri ile yapılan işlemler okunabilirli açısından daha kullanışlı oluyor. Koda üç sonra baktığımızda da, veri tabanından 2. indekste hangi kolon vardı diye kontrol etmemize gerek kalmıyor. Ben de bu konuda tercih yapacak olsam sizin gibi kolon isimlerine yönelirdim.

Denediğiniz kodda sorun olacak olursa paylaşırsanız bilgisi ve ilgisi olan arkadaşlarca daha kolay çözülebilir, takıldığınız nokta olursa tabi.

Bunun dışında tupple içerisinde tupple dönmesini engellemenin bir yolu var mı bilemiyorum ama bir şeyin içerisinde bir şey olması zorunlu gibi aslında. Bu şekilde düşünrseniz daha kolay olacaktır. Bu saçma ibare yani bir şeyin içerisinde bir şey ile şunu ifade etmek istiyorum. 

Bir verimiz var. Bu veriyi veri tabanından sorgulayarak alacağız. Veri tabanından sorgulayacağımız veri bir tablodan, bir view'dan ya da materialized view gibi bir birimden geliyor olabilir. Bu birimler de yapısal olarak iki boyutlu veriler içeriyor. Yani istediğimiz sütunları çekmeliyiz veri tabanından. tablom ismindeki tabloda a,b,c,d,e, alanları bulunuyor olsun. Örnek olarak biz sadece iki tanesine ihtiyaç duyalım; a ve b alanlarını istiyoruz;


select a
,           b
from tablom
where 1 = 1
;

diye sorgumuzu attık diyelim. Burada bir satırlık bir veri içerisinde birden fazla veri dönüyor; a ve b alanlarındaki veriler. Bu nedenle bir satırı ancak bir dizi, bir array, bir list gibi bir tür ile tanımlayabiliriz. Burada mütabık olduğumuzu sanıyorum. Bu veri için çünkü veri tabanından a,b,c,d,.... şeklinde 20 tane de alanı isteyebilirdik bir kerede. Buradan bir satırlık bir veri dönerse tamam, bir tane dizi, ya da array vs. hangi türü kullanacaksak işimizi görecektir. Bu durumda elimizde bir satırlık bir veri için bir tupple'ımız var olduğunu düşünelim, keza öyle de olduğu görünüyor =)...

Bir satırlık veriyi birSatirTupple ismide tupple değişkenine (result nesnesinden) atatığımzı düşünelim. Bir tupple'ım oldu bir select sorgusundan dönen bir satırlık veri için. Bu durumda soru şu; veri tabanına gönderdiğim ifadeden 10 satırlık bir veri dönerse ne olacak? Bir satır için bir tupple'a ihtiyacım oluyordu. Bu durumda 10 tupple'ı saklayacak bir veriye ihtiyacım var. Bu bir tupple da olabilir, bir array vs... Yine bellekte birden fazla nesnei içerisinde saklayabilen bir veriye ihityacım var. Örneğimizde yani kullandığınız kütüphanede bunu tupple olarak seçmişler. 

Yani elimdeki veri gereği bir şeyin içerisinde bir şeye ihtiyacım var. Açıklamak istediğim konu buydu.

Şu şekilde gidecek olursak da açıklayaıcı olacaktır;


SELECT * FROM liste WHERE id='2'


ifadesi yerine, veri tabanında 5 kayıt varken yani 5 kere insert çalıştıktan sonra;



SELECT * FROM liste

Sorgusundan dönecek olan 5 satır ne şekilde yapılandırılmalı? Bir tane tupple dönülemez çünkü matris şeklinde bir verimiz olacak. tupple tek boyutlu bir veri türü. Bu durumda bize iki boyutlu bir veri gerekli, iki boyutlu bir array ile dönülebilir örneğin. Bu durumda 


veri[0][1]


şeklinde 1. satırdaki ikinci sütuna ulaşabilirdik. Bu tercih meslesi artık, kütüphaneyi yazanlar tupple'ı uygun görmüşler, iki boyutlu dizi yerine, tupple içerisinde tupple dönmüşler. Belki de tupple'ın içerdiği nesnelerin içerisine yazmak array'deki gibi kolay olmadığı için yani salt okunur olduğu (jargondaki tabiri ile immutable) için yani daha güvenli gördükleri için ya da herhangi bir sebepten bu yapıyı tercih etmiş olabilirler. Fakat bu yapı yerine farklı bir şeyler seçseler, yine aynı şekilde iki boyutlu bir nesne dönmek zorunda kalacaklardı.

Kafanıza takılan yeri doğru anladyısam eğer cevap bu =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

okkangal

Sn sem gerçekten , neden  veri çıktısının tuple olduğu konusunda önemli bir açıklama getirdiniz. Aslında MySQL için python'da bir kaç modül haricinde fazla seçeneğimiz yok . O nedenle elimizde olanla yetineceğiz ve ihtiyacımıza göre bir çözüm bulacağız. Aslında tuple olarak çektiğimiz verileri , kendi sınıflarımızı yazarak daha düzenli hale getirme imkanımız var ama belki biraz zaman alabilir ama daha okunur bir kod haline getirebiliriz.

İlginiz ve açıklamanız için çok teşekkür ederim . Bir sonraki konu ile ilgili denememin kodlarını burada paylaşacağım .

sem

Ufak bir anekdot düşeyim fikir vermesi açısından, mevcut modül ile geliştirme yapacaksanız ama sütun indekslerine isim ile ulaşmak ve kodu okunur hale getirme istiyorsanız bir hash yapısı yani Python karşılığı olan Dictionary nesnelerinden yararlanabilirsiniz. Hash' yapısının anahtar (key) değeri kolon ismi olan bir string nesnesi, hash yapısının değeri ise (value) bu stringe karşılık gelen sütun indeksi.


tabloIsmiDict= {"ad": 0, "soyad":1, "telefon": 2}



Daha sonradan sütuna ulaşmak için, (aşağıdaki veri bir satırı tutan bir veri olarak düşünelim);

print "Ad: " + veri[tabloIsmiDict["ad"]]

Şeklinde bir şey olabilir. Gerçi ne kadar okunur olur o da tartışılır ama en azından ileride koda dönüp bakında veri tabanından kontrol etmeniz gerekliliğini ortadan kaldırır. EK yük getirme ihtimali ise veri tabanında tabloya alan eklenirse tabloIsmiDict nesnesi eşleştirmelerini gözden geçirmek gerekebilir. Bu nedenle böyle bir yapı için "önce model"  ("model first" ) tasarımı ile gitmenizi öneririm.

İyi çalışmalar.


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 16 Mart 2014 - 22:36:44

Anekdot: Paylaştığım Python kodlarının sözdizimini (syntax) kontrol etmedim sadece fikir verme açısından yazdığım için. Gözden kaçırdığım ya da kafanıza takılan noktayı belirtirseniz açıklık getireyim. İyi çalışmalar.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?