Merhaba bu yazımızda sizlerle python ile mysql veri tabanı bağlantı işlemlerini yapcağız. Mysql Oracle tarafından geliştirlen bir veri tabanıdır. Hali hazırda php,.net,java gibi bir çok programlama dilleri tarafındanda ücretsiz olarak kullanılmaktadır. Python ile mysql işlemleri yapabilmeniz için öncelikle mysql veri tabanınızın kurulu olması gerekmetedir. Bu işlem iki şekilde gerçeleştirilebilir. İster seni mysql.com adresinden indirebilirsiniz.
Mysql veritabanızı kurduğunuzu var sayarak şimdi python için mysql-connector’un kurulması gerekmektedir. Öncelikle siteminiz de python dosyasının kurulduğu dizini bulun ve python dizini içerisinde script dizinine giriniz benim bilgisayarımda aşağıdaki gibidir.
C:\Users\webMaster\AppData\Local\Programs\Python\Python39\Scripts
bu dizini bulduktan sonra konsola cmd yazın ve gelen siyah ekranda aşağıdaki kodu kendi sistem dizininize göre uyarlayıp çalıştırınız.
cd C:\Users\webMaster\AppData\Local\Programs\Python\Python39\Scripts
Daha sonra python mysql kurulumu için aşağıdaki pip install komudunu veriniz.
pip install mysql-connector-python
Hata metini almıyorsanız ve consolda sistem yüklemesi olmuşsa success olarak bir çıktı alacaksınız. Buraya kadar tam olarak ulaşmışsanız şimdi başlayabiliz.
.
Python MYSQL Veritabanı Bağlantısı
Öncelikle bağlantıyı kurabilmeniz için sayfa başında import msyql.connector
satırını ekleyerek mysql.connector modülünü çağıralım. Daha sonra aşağıdaki kodlama düzeninde sistem bilgilerini verelim.
Öncelikle sayfamıza mysql.connector pakatini dahil ediyoruz
1 | import mysql.connector |
Şimdi de mysql bağlantı bilgilerimizi girerek bağlantımızı kuralım.
1 2 3 4 | mydb = mysql.connector.connect( host = "localhost", user = "root", password = "") |
Eğer çalıştırdığınızda hata almıyorsanız problem yok demektir. Şimdi ise bir tane veri tabanı oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | mydb = mysql.connector.connect(host = "localhost",user = "root",password = "") if mydb.is_connected(): #verit tabanı bağlantısını kontrol ettik print("baglı") cursor=mydb.cursor() cursor.execute("Create database pythondb") #pythondb adında bir veritabanı oluşturduk cursor.execute("show databases") #var olan veri tabanlarını listemek için sql komudumuzu girdir. for x in cursor: print(x) ## var olan veri tabanlarını döngüye sokarak ekrana girdik. cursor.close() #cursor'ü kapattık mydb.close() # Bağlantıyı kapattık #######ekran çıktı##################### # ('information_schema',) # ('mysql',) # ('performance_schema',) # ('phpmyadmin',) # ('pythondb',) # ('test',) |
Yukarıda yeni bir vertabanı oluşturduk ve mysql de bulunana ver tabanlarını listeledik. Şimdi ise istediğimiz bir vertabanına bağlanalım ve yeni bir tablo oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | dbbag=mysql.connector.connect( host="localhost", user="root", password="", database="pythondb" ) #pythondb adında bir veritabanına bağlandık if dbbag.is_connected():#bağlatımızı kontrolünü yaptık print("Veri tabanına bağlandı") dbcursor=dbbag.cursor() dbcursor.execute(""" CREATE TABLE kullanicilar ( userid int(11) PRIMARY KEY AUTO_INCREMENT, username varchar(50) NOT NULL, userpassword varchar(32) NOT NULL, usermail varchar(150) NOT NULL, useractive int(1) DEFAULT 0 ); """) #Veri tabanımızda kullanicilar adında bir tablo oluşturduk dbcursor.execute("show tables") # Veri tabanımızda bulunan tabloları listesini aldık for i in dbcursor: #almış olduğumuz listeyi döngüye sokarak ekrana çıktısını aldık. print(i) dbcursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık |
Şimdi ise oluştuduğumuz veritabanına kullanıcılarımızı ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #daha önceden oluşturduğumuz bağlantının üzerine dbcursor=dbbag.cursor() slq=""" insert into kullanicilar(userid,username,userpassword,usermail,useractive) values(null,%s,md5(%s),%s,%s) """ #sql kodumuzu hazırladık ve kullaıcılar tablosunu bir adet veri girişi yapacağız veri=("Çağlar Bostancı","123123123","info@caglarbostanci.com.tr",1) #burda ise sql injection saldırılarını önelmek için sql içerisinde %s ile bilirlediğmiz alanlara tumple bir veri oluşturduk. dbcursor.execute(slq,veri) #sql kodumuzu birinci parametre olarak verileri ise ikinci parametre olarak ekledik. dbbag.commit() # şimdi ise sql kodlarımız commit ettik bu komudu vermezseni sql veri girişi olmayacaktır. print(dbcursor.rowcount," adet kullanıcı girildi") #dbcursor.rowcount ile kaç satır veri girdiğimiz ekrana yazdırdık. dbcursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık ############EKRAN ÇIKTISI################### #Veri tabanına bağlandı # 1 adet kullanıcı girildi |
Tabi her zaman verilermizi tek tek girmeyeceğiz toplu olarakta veri girişleri yapmamız gerekebilir. Şimdi aşağıdaki örneğimizde ise birden çok veri girişini yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ##################Çoklu Veri Girişi##################### dbcursor=dbbag.cursor() sql=""" insert into kullanicilar values (null,%s,md5(%s),%s,%s) """ # sql kodumuz hazırladık ve verilen geleceği yerleri sql injection önelmi için %s ile belirledik. veri=[ ("Ahmet Taşçı","123","ahmet@gmail.com",1), ("Alp Demir","123","alp@gmail.com",0), ("Tarık Gemici","123","tarik@gmial.com",1), ("Meryem Yılmaz","123","meryem@gmail.com","") ] #burda ise birden çok veri girişi yapacağımız için bir liste hazırladık. Bu liste içersinde her kullanıcının verisini bir tuple haline getirdik. dbcursor.executemany(sql,veri) #sql kodumuz ve verilerimizi çalıştırmak için hazırladık. dbbag.commit() # sql veri girişini startını verdik if dbcursor.rowcount > 0: # kaç adet veri girişi sağladımızı öğrendik ve bu sayı sıfırdan büyükse veri giriş yapıldığına dair mesaj verdik. print(dbcursor.rowcount,"Adet kullanıcı eklendi.") else: print("Kullanıcı girişi yapılamadı.") #aksi bir durumda veri girişi sağlanamazsa ekran çıktımızı hazırladık dbcursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık ##################Ekran Çıktısı############### #Veri tabanına bağlandı #4 Adet kullanıcı eklendi. |
Hadi şimdi hep beraber veritabanına girmiş olduğumuz verileri ekrana pasalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ###############VERİ OKUMA####################### dbcursor=dbbag.cursor() dbcursor.execute("select * from kullanicilar") #tablomuzdaki bütün verilerin gelmesini istedik gelenData=dbcursor.fetchall() if dbcursor.rowcount > 0: print(dbcursor.rowcount,"Adet veri var") for user in gelenData: print(user) dbcursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık ######################EKRAN ÇIKTISI############## # Veri tabanına bağlandı # 6 Adet veri var # (1, 'Çağlar', 'Bostancı', 'info@caglarbostanci.com.tr', 1) # (2, 'Çağlar Bostancı', 'f5bb0c8de146c67b44babbf4e6584cc0', 'info@caglarbostanci.com.tr', 1) # (3, 'Ahmet Taşçı', '202cb962ac59075b964b07152d234b70', 'ahmet@gmail.com', 1) # (4, 'Alp Demir', '202cb962ac59075b964b07152d234b70', 'alp@gmail.com', 0) # (5, 'Tarık Gemici', '202cb962ac59075b964b07152d234b70', 'tarik@gmial.com', 1) # (6, 'Meryem Yılmaz', '202cb962ac59075b964b07152d234b70', 'meryem@gmail.com', 0) |
Bütün kullanıcılarımızı listeledik aynı zamanda eğer istersek where şartı kullanara belirli şartlara görede kullanıcılarımızı listeleyebirlir.Pyton mysql veritabanı kullanımında belirli bir id deki kullanıcımızı listeleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | dbcursor=dbbag.cursor() sql=""" select * from kullanicilar where userid=%s """ #userid 2 olan kullanıcımızı listelemek için sql sorgumuzu hazırladık. veri=(2,) dbcursor.execute(sql,veri) #sql injectionı önlemek için dışardıan gelen değerleri ikinci parametre olarak tuple olarak verdik. gelenData=dbcursor.fetchone() if dbcursor.rowcount > 0: print(dbcursor.rowcount,"Adet veri var") print(gelenData) dbcursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık #########################EKRAN ÇIKTISI################################## # Veri tabanına bağlandı # 1 Adet veri var # (2, 'Çağlar Bostancı', 'f5bb0c8de146c67b44babbf4e6584cc0', 'info@caglarbostanci.com.tr', 1) |
Tabi buraya kadar mysql genel sorgularını öğrenmiş olduk şimdi ise iki tablo verisini inner join ile birleştirerek ekrana basmayı öğrenelim. Inner join kullanımınızı ve diğer msyql sorguları bildiğinizi varsayarak devam ediyorum. Elimzde bulunan kullanıcılar tablosu ile bu kullanıcıların detay bilgilerinin bulunduğu “detay” tablosunu birleştirerek ekrana çıktı alalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ########################JOIN İŞLEMLERİ##################################### dbcursor=dbbag.cursor() sql=""" select * from kullanicilar inner join detay on kullanicilar.userid=detay.userid where kullanicilar.userid=%s """ #iki tabluyu birleştirdiğimiz sql sorgusunu hazırlardık. veri=(1,) #sadece bir tane kullanıcıyı çekeceğimiz içi ilgili where şartının parametresini ayarlardık. dbcursor.execute(sql,veri) dataveri=dbcursor.fetchone() #sadece bir adat veri alacağımız için fetchone kullandık. if dbcursor.rowcount > 0: #gelen satırı sorguladık eğer 0 dan büyükse verinin geldiğini ön gördük print(dbcursor.rowcount,"adert veri bulundu") print(dataveri) #ekranımıza gelen veriyi bastık. dbcursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık # ###########################EKRAN ÇIKTISI##################################### # Veri tabanına bağlandı # 1 adert veri bulundu # (1, 'Çağlar', 'Bostancı', 'info@caglarbostanci.com.tr', 1, 1, 'ANKARA/YENİMAHALLE M.AKİF ERSON CAD. SİTE APT 34/4', '5439571508') |
Peki veritabanından gelen verileri sütun isimlerine göre listelemek istersek ne yapacağız. Öncelikle sütün isimlerini
cursor.column_names
ile alıyoruz. Sonra diğer gelen satırlarla bunu eşleştiriyoruz. Tabi bunun izin zip
metodundan yararlanıyoruz. Bu bize ("sutun_adi","veri")
şeklinde bir değer dönderir. Bu gelen veriyide dict
methodu ile bir sözlük(dict) oluşturmuş oluruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 | myCursor = dbBag.cursor() # cursoru örnekledik myCursor.execute("select * from ogrenci") # sorgumuzu çalıştırıyoruz. sutunName = myCursor.column_names # sütun isimlerini aldık for i in myCursor: # döngüye sokarak verileri satır satır çekiyoruz. print(dict(zip(sutunName,i))) # gelen her satırı sütun isimleri ile birleştiriyoruz. myCursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık # Ekran Çıktısı # {'id': 1, 'ad': 'Çağlar', 'soyad': 'Bostancı', 'mail': 'info@caglarbostanci.com', 'sinif': 1, 'okulno': 1} # {'id': 2, 'ad': 'Tarık', 'soyad': 'Tan', 'mail': 'tarik@gmail.com', 'sinif': 2, 'okulno': 2} |
Python ile MySQL veri tabnı bağlantısında en önemli sorunlardan biride mysql python bağlantısında procedur’leri nasıl çalıştıracağımız. Saklı yordamlar yani prosedürler programcılar için performans ve güvenlik açısından önem arzetmektedir. Gelin isterseniz bir prosedürü nasıl çalıştıracağımızı görelim
1 2 3 4 5 6 | mycursor = dbbag.cursor() #cursor'ün bir örneğini oluşturduk mycursor.callproc('ogrliste') # parametresiz çalışan prosödürümüzü çağırdık for i in mycursor.stored_results(): # verileri satır satır çektik print(i.fetchall()) # her satırı ekran bastık myCursor.close() #cursor'ü kapattık dbbag.close() # Bağlantıyı kapattık |
Son olarak eğer bağlantınızı linux bir işletim sistemi (Ubuntu,pardus vs.) üzerinden yapıyorsanız “Authentication plugin ‘caching_sha2_password’ is not supported” hatası alabilirsiniz. Bunu önlemek için bağlantı kurduğumuz scripte ek parametere
olarak auth_plugin='mysql_native_password'
yazarak sorunu çözebilirsiniz.
1 2 3 4 5 6 7 8 | import mysql.connector dbBag = mysql.connector.connect( host = "localhost", user = "root", password = "caglarbostanci", database = "pythonDB", auth_plugin='mysql_native_password' ) |
Evet arkadaşlar bu yazımızda sizlerle python veritabanı işlemlerini inceledik. Bu öreneklemler sayesinde veritabanı işlemlerinizi artırabilirsiniz. Önerim procedure ve fonksiyon yazarak bunların kullanımını öğrenmenniz ve update delete örenekleri yapabilirisiniz. Başarılar dilerim.