Skip to content

9. SGBD'in kullanımı MySQL

9.1. MySQLdb modülünün kurulumu

MySQL veritabanını kullanan komut dosyaları yazacağız:

MySQL veritabanını yönetmeye yarayan Python işlevleri, Python'un ilk dağıtımında bulunmayan MySQLdb modülünde toplanmıştır. Bu nedenle modülü indirip kurmanız gerekir. İşte bunu yapmanın bir yolu:

  • Programlar menüsünden [1] Python paket yöneticisini seçin. Ardından [2] komut penceresi açılacaktır.

Paketler arasında mysql anahtar kelimesini arayın:


C:\Documents and Settings\st>pypm search mysql
Get: [pypm-be.activestate.com] :repository-index:
Get: [pypm-free.activestate.com] :repository-index:
autosync: synced 2 repositories
  chartio                    Setup wizard and connection client for connecting
  chartio-setup              Setup wizard and connection client for connecting
  cns.recipe.zmysqlda        Recipe for installing ZMySQLDA
  collective.recipe.zmysqlda Recipe for installing ZMySQLDA
  django-mysql-manager       DESCRIPTION_DESCRIPTION_DESCRIPTION
  jaraco.mysql               MySQLDB-compatible MySQL wrapper by Jason R. Coomb
  lovely.testlayers          mysql, postgres nginx, memcached cassandra test la
  mtstat-mysql               MySQL Plugins for mtstat
  mysql-autodoc              Generate HTML documentation from a mysql database
  mysql-python               Python interface to MySQL
  mysqldbda                  MySQL Database adapter
  products.zmysqlda          MySQL Zope2 adapter.
  pymysql                    Pure Python MySQL Driver
  pymysql-sa                 PyMySQL dialect for SQLAlchemy.
  pymysql3                   Pure Python MySQL Driver
  sa-mysql-dt                Alternative implementation of DateTime column for
  schemaobject               Iterate over a MySQL database schema as a Python o
  schemasync                 A MySQL Schema Synchronization Utility
  simplestore                A datastore layer built on top of MySQL in Python.
  sqlbean                    A auto maping ORM for MYSQL and can bind with memc
  sqlwitch                   sqlwitch offers idiomatic SQL generation on top of
  tiddlywebplugins.mysql     MySQL-based store for tiddlyweb
  tiddlywebplugins.mysql2    MySQL-based store for tiddlyweb
zest.recipe.mysql          A Buildout recipe to setup a MySQL database.

Adında veya açıklamasında mysql anahtar kelimesi bulunan tüm modüller listelenmiştir. İlgilendiğimiz modül, 14. satırdaki [mysql-python]'tir. Bunu kuruyoruz:


C:\Documents and Settings\st>pypm install mysql-python
The following packages will be installed into "%APPDATA%\Python" (2.7):
 mysql-python-1.2.3
Hit: [pypm-free.activestate.com] mysql-python 1.2.3
Installing mysql-python-1.2.3

C:\Documents and Settings\st>echo %APPDATA%
C:\Documents and Settings\st\Application Data
    1. satır: mysql-python-1.2.3 paketi, 8. satırda belirtilen "%APPDATA%\Python" klasörüne kuruldu.

Aşağıdaki durumlarda bu işlem başarısız olabilir:

  • kullanılan Python yorumlayıcısı 64 bit sürüm ise;
  • %APPDATA% yolu aksanlı karakterler içeriyorsa.

9.2. MySQL'in kurulumu

SGBD ve MySQL'i kurmanın çeşitli yolları vardır. Burada, birkaç yazılımı bir araya getiren WampServer paketini kullandık:

  • bir Apache web sunucusu. Bunu Python ile web komut dosyaları yazmak için kullanacağız;
  • SGBD ve MySQL;
  • PHP betik dili;
  • SGBD MySQL'te PHP ile yazılmış bir yönetim aracı: phpMyAdmin.

WampServer, Haziran 2011 itibarıyla şu adresten indirilebilir:

http://www.wampserver.com/download.php
  • [1] dosyasını indirirken, uygun olan WampServer sürümünü indirin;
  • [2]'te, kurulum tamamlandıktan sonra programı çalıştırın. Bu işlem, Apache web sunucusunu ve SGBD ile MySQL'i başlatacaktır;
  • [3]'te, başlatıldıktan sonra, WampServer, görev çubuğunun sağ alt köşesindeki [3] simgesinden yönetilebilir;
  • [4]'te, MySQL yönetim aracı başlatılır.

[dbpersonnes] veritabanı oluşturulur:

Image

[admpersonnes] adlı bir kullanıcı, [nobody] şifresiyle oluşturulur:

  • [1], kullanıcı adı;
  • [2] olarak, SGBD makinesinde kendisine verilen haklar;
  • [3]'te, şifresi [nobody];
  • [4] olarak, aynı şekilde;
  • [5]'te, bu kullanıcıya hiçbir hak verilmez;
  • [6]'te, kullanıcı oluşturulur.
  • [7]'te, phpMyAdmin'in ana sayfasına geri dönülür;
  • [8]'te, bu sayfadaki [Privileges] bağlantısını kullanarak [admpersonnes] ve [9] kullanıcılarının ayarlarını düzenlemeye gidilir.
  • [10]'te, [admpersonnes] kullanıcısına [dbpersonnes] veritabanı üzerinde haklar vermek istediğimiz belirtilir;
  • [11]'te seçim onaylanır.
  • [12] [Tout cocher] bağlantısı ile, [admpersonnes] kullanıcısına [dbpersonnes] ve [13] veritabanları üzerinde tüm haklar verilir;
  • [14]'te onaylanır.

Artık elimizde şunlar var:

  • MySQL ve [dbpersonnes] veritabanları;
  • bu veritabanı üzerinde tüm haklara sahip bir kullanıcı: [admpersonnes / nobody].

Veritabanını kullanmak için Python komut dosyaları yazacağız.

9.3. MySQL veritabanına bağlanma - 1


Program (mysqldb_01)


# MySQLdb modülünü içe aktarıyoruz
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb

# bir veritabanına bağlanma MySQL
....

Notlar:

  • 2-4. satırlar: SGBD ve MySQL ile işlemler içeren komut dosyaları, MySQLdb modülünü içe aktarmalıdır. Bu modülü [%APPDATA%\Python] klasörüne kurduğumuzu hatırlayalım. Bir Python kodu bir modül talep ettiğinde, [%APPDATA%\Python] klasörü otomatik olarak taranır. Aslında, sys.path içinde bildirilen tüm klasörler taranır. İşte bu klasörleri görüntüleyen bir örnek:

# -*- coding=utf-8 -*-

import sys

# klasörlerin görüntülenmesi sys.path
for dossier in sys.path:
    print dossier

Ekran çıktısı şu şekildedir:

D:\data\istia-1112\python\tutoriel
C:\Windows\system32\python27.zip
D:\Programs\ActivePython\Python2.7.2\DLLs
D:\Programs\ActivePython\Python2.7.2\lib
D:\Programs\ActivePython\Python2.7.2\lib\plat-win
D:\Programs\ActivePython\Python2.7.2\lib\lib-tk
D:\Programs\ActivePython\Python2.7.2
C:\Users\Serge TahÚ\AppData\Roaming\Python\Python27\site-packages
D:\Programs\ActivePython\Python2.7.2\lib\site-packages
D:\Programs\ActivePython\Python2.7.2\lib\site-packages\win32
D:\Programs\ActivePython\Python2.7.2\lib\site-packages\win32\lib
D:\Programs\ActivePython\Python2.7.2\lib\site-packages\Pythonwin
D:\Programs\ActivePython\Python2.7.2\lib\site-packages\setuptools-0.6c11-py2.7.egg-info
  1. satırda, [site-packages] klasörü görülmektedir; MySQLdb başlangıçta buraya kurulmuştu. pypm yardımcı programının Python modüllerini yüklediği dizin olan [site-packages] dizinini taşıyoruz. Python'un modülleri aramak için tarayacağı yeni bir dizin eklemek için, bunu sys.path listesine ekliyoruz:

# modülün içe aktarılması MySQLdb
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb

# MySQL veritabanına bağlanma
....
  1. satıra, MySQLdb modülünün taşındığı klasörü ekleyin.

Örneğin tam kodu şöyledir:


# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb

# bir veritabanına bağlanma MySQL
# kullanıcı kimliği (admpersonnes,nobody)
user="admpersonnes"
pwd="nobody"
host="localhost"
connexion=None
try:
    print "connexion..."
    # oturum açma
    connexion=MySQLdb.connect(host=host,user=user,passwd=pwd)
    # izleme
    print "Connexion a MySQL reussie sous l'identite host={0},user={1},passwd={2}".format(host,user,pwd)
except MySQLdb.OperationalError,message:
    print "Erreur : {0}".format(message)
finally:
    try:
        connexion.close()
    except:
        pass

  • 8-11. satırlar: komut dosyası (15. satırda), [admpersonnes / nobody] kullanıcısını [localhost] makinesindeki SGBD ve MySQL'e bağlayacaktır. Kullanıcı belirli bir veritabanına bağlanmaz;
  • 12-24. satırlar: Bağlantı başarısız olabilir. Bu nedenle, bağlantı işlemi bir try / except / finally bloğu içinde gerçekleştirilir;
    1. satır: MySQLdb modülünün connect yöntemi, farklı adlandırılmış parametreleri kabul eder:
    2. user: [admpersonnes] bağlantısının sahibi olan kullanıcı;
    3. pwd: [nobody] kullanıcısının şifresi;
    4. host: MySQL ve [localhost] veritabanı yönetim sisteminin bulunduğu makine;
    5. db: Bağlanılacak veritabanı. İsteğe bağlı.
    1. satır: Bir istisna atılırsa, bu istisna [ MySQLdb.OperationalError] türündedir ve ilgili hata mesajı [message] değişkeninde bulunur;
  • 20-23. satırlar: [finally] cümlesinde bağlantı kapatılır. Bir istisna oluşursa, bu istisna yakalanır (23. satır) ancak herhangi bir işlem yapılmaz (24. satır).

Sonuçlar

connexion...
Connexion a MySQL reussie sous l'identite host=localhost,user=admpersonnes,passwd=nobody

9.4. MySQL veritabanına bağlanma - 2


Program (mysqldb_02)


# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb

# ---------------------------------------------------------------------------------
def testeConnexion(hote,login,pwd):
    # sunucu hote'deki mysql veritabanı sistemine (login, pwd) bağlanıp sonra bağlantıyı keser
    # MySQLdb.operationalError istisnasını tetikler
    # bağlantı
    connexion=MySQLdb.connect(host=hote,user=login,passwd=pwd)
    print "Connexion a MySQL reussie sous l'identite (%s,%s,%s)" % (hote,login,passwd)
    # bağlantı kapatılıyor
    connexion.close()
    print "Fermeture connexion MySQL reussie\n"
 

# ---------------------------------------------- ana program
# veritabanına bağlantı MySQL
# kullanıcı kimliği
user="admpersonnes"
passwd="nobody"
host="localhost"
# bağlantı testi
try:
    testeConnexion(host,user,passwd)
except MySQLdb.OperationalError,message:
    print message
# var olmayan bir kullanıcıyla
try:
    testeConnexion(host,"xx","xx")
except MySQLdb.OperationalError,message:
    print message

Notlar:

  • 7-15. satırlar: Bir kullanıcıyı SGBD MySQL'e bağlamaya ve ardından bağlantıyı kesmeye çalışan bir işlev. Sonucu görüntüler;
  • 18-34. satırlar: ana program – testeConnexion yöntemini iki kez çağırır ve olası istisnaları görüntüler.

Sonuçlar

1
2
3
4
Connexion a MySQL reussie sous l'identite (localhost,admpersonnes,nobody)
Fermeture connexion MySQL reussie

Echec de la connexion a MySQL : (1045, "Access denied for user 'xx'@'localhost'(using password: YES)")

9.5. MySQL tablosunun oluşturulması

Artık bir SGBD MySQL ile bağlantı kurmayı öğrendiğimize göre, bu bağlantı üzerinden SQL komutları vermeye başlayacağız. Bunun için, oluşturulan [dbpersonnes] veritabanına bağlanacağız ve bu bağlantıyı kullanarak veritabanında bir tablo oluşturacağız.


Program (mysqldb_03)


# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb

# ---------------------------------------------------------------------------------
def executeSQL(connexion,update):
    # bağlantı üzerinde güncelleme isteği yürütülüyor
    # bir imleç isteniyor
    curseur=connexion.cursor()
    # bağlantı üzerinde SQL sorgusu yürütülüyor
    try:
        curseur.execute(update)
        connexion.commit()
    except Exception, erreur:
        connexion.rollback()
        raise
    finally:
        curseur.close()

# ---------------------------------------------- ana işlev
# MySQL veritabanına bağlanıyor
# kullanıcı kimliği
ID="admpersonnes"
PWD="nobody"
# veritabanı yönetim sisteminin ana bilgisayarı
HOTE="localhost"
# veritabanı kimliği
BASE="dbpersonnes"
# bağlantı
try:
    connexion=MySQLdb.connect(host=HOTE,user=ID,passwd=PWD,db=BASE)
except MySQLdb.OperationalError,message:
    print message
    sys.exit()

# "kişiler" tablosu varsa silinir
# Varsa bir hata oluşacaktır
# bu durum göz ardı edilir
requete="drop table personnes"
try:
    executeSQL(connexion,requete)
except:
    pass
# "kişiler" tablosunun oluşturulması
requete="create table personnes (prenom varchar(30) NOT NULL, nom varchar(30) NOT NULL, age integer NOT NULL, primary key(nom,prenom))"
try:
    executeSQL(connexion,requete)
except MySQLdb.OperationalError,message:
    print message
    sys.exit()
# oturum kapatılır ve programdan çıkılır
try:
    connexion.close()
except MySQLdb.OperationalError,message:
    print message
sys.exit()

Notlar:

    1. satır: executeSQL işlevi, açık bir bağlantı üzerinde SQL sorgusunu yürütür;
    1. satır: Bağlantı üzerindeki SQL işlemleri, imleç adı verilen özel bir nesne aracılığıyla gerçekleştirilir;
    1. satır: bir imleç alınır;
    1. satır: SQL sorgusunun yürütülmesi;
  • satır 14: mevcut işlem onaylanır;
  • satır 15: istisna durumunda, hata mesajı "hata" değişkeninde depolanır;
  • satır 16: mevcut işlem geçersiz kılınır;
  • satır 17: istisna yeniden tetiklenir;
  • satır 19: hata olsun ya da olmasın, imleç kapatılır. Bu, imleçle ilişkili kaynakları serbest bırakır.

Sonuçlar

create table personnes (prenom varchar(30) NOT NULL, nom varchar(30) NOT NULL, age integer NOT NULL, primary key(nom,prenom)) : requete reussie

phpMyAdmin ile doğrulama:

  • [dbpersonnes] [1] veritabanında, [personnes] [2] adlı bir tablo bulunur; bu tablonun yapısı [3] ve birincil anahtarı [4]'e sahiptir.

9.6. [personnes] tablosunun doldurulması

Daha önce [personnes] tablosunu oluşturduktan sonra, şimdi bu tabloyu dolduruyoruz.


Program (mysqldb_04)


# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# diğer modüller
import re

# ---------------------------------------------------------------------------------
def executerCommandes(HOTE,ID,PWD,BASE,SQL,suivi=False,arret=True):
    # bağlantıyı kullan (HOTE,ID,PWD,BASE)
    # bu bağlantı üzerinden SQL metin dosyasında bulunan SQL komutlarını yürütür
    # bu dosya, her satırda bir tane olmak üzere çalıştırılacak SQL komut dosyasıdır
    # eğer takip=True ise, her bir SQL komutunun yürütülmesi, komutun başarılı olup olmadığını belirten bir mesajın görüntülenmesiyle sonuçlanır
    # durdurma=True ise, işlev karşılaşılan ilk hatada durur; aksi takdirde tüm SQL komutlarını yürütür
    # fonksiyon bir liste döndürür (hata sayısı, hata1, hata2, ...)

    # SQL dosyasının varlığı kontrol edilir
    data=None
    try:
        data=open(SQL,"r")
    except:
        return [1,"Le fichier %s n'existe pas" % (SQL)]

    # bağlantı
    try:
        connexion=MySQLdb.connect(host=HOTE,user=ID,passwd=PWD,db=BASE)
    except MySQLdb.OperationalError,erreur:
        return [1,"Erreur lors de la connexion a MySQL sous l'identite (%s,%s,%s,%s) : %s" % (HOTE, ID, PWD, BASE, erreur)]
    
    # bir imleç talep edilir
    curseur=connexion.cursor()
    # SQL dosyasında bulunan SQL sorgularının yürütülmesi
    # bunlar bir tabloya ekleniyor
    requetes=data.readlines()
    # tek tek çalıştırılıyor - başlangıçta hata yok
    erreurs=[0]
    for i in range(len(requetes)):
        # geçerli sorguyu saklıyoruz
        requete=requetes[i]
        # Sorgu boş mu? Eğer öyleyse, bir sonraki sorguya geçilir
        if re.match(r"^\s*$",requete):
            continue
        # i sorgusunu çalıştırıyoruz
        erreur=""
        try:
            curseur.execute(requete)
        except Exception, erreur:
            pass
        #Bir hata oluştu mu?
        if erreur:
            # bir hata daha
            erreurs[0]+=1
            # hata mesajı
            msg="%s : Erreur (%s)" % (requete,erreur)
            erreurs.append(msg)
            # ekran izleme var mı, yok mu?
            if suivi:
                print msg
            # durulacak mı?
            if arret:
                return erreurs
        else:
            if suivi: 
                print "%s : Execution reussie" % (requete)
    # bağlantıyı kapatma ve kaynakları serbest bırakma
    curseur.close()
    connexion.commit()
    # bağlantı kesiliyor
    try:
        connexion.close()
    except MySQLdb.OperationalError,erreur:
        # bir hata daha
        erreurs[0]+=1
        # hata mesajı
        msg="%s : Erreur (%s)" % (requete,erreur)
        erreurs.append(msg)

    # geri dönüş
    return erreurs


# ---------------------------------------------- ana
# veritabanına bağlanma MySQL
# kullanıcı kimliği
ID="admpersonnes"
PWD="nobody"
# veritabanı yönetim sisteminin ana bilgisayarı
HOTE="localhost"
# veritabanı kimliği
BASE="dbpersonnes"
# çalıştırılacak SQL komut metin dosyasının kimliği
TEXTE="sql.txt";

# tablonun oluşturulması ve doldurulması
erreurs=executerCommandes(HOTE,ID,PWD,BASE,TEXTE,True,False)
# hata sayısının görüntülenmesi
print "il y a eu %s erreur(s)" % (erreurs[0])
for i in range(1,len(erreurs)):
    print erreurs[i]


Sonuçlar

sql.txt dosyası:

1
2
3
4
5
6
7
8
9
drop table personnes
create table personnes (prenom varchar(30) not null, nom varchar(30) not null, age integer not null, primary key (nom,prenom))
insert into personnes values('Paul','Langevin',48)
insert into personnes values ('Sylvie','Lefur',70)
xx

insert into personnes values ('Pierre','Nicazou',35)
insert into personnes values ('Geraldine','Colou',26)
insert into personnes values ('Paulette','Girond',56)
  1. satıra kasıtlı olarak bir hata eklenmiştir.

Ekran sonuçları:

drop table personnes : Execution reussie
create table personnes (prenom varchar(30) not null, nom varchar(30) not null, age integer not null, primary key (nom,prenom)) : Execution reussie
insert into personnes values('Paul','Langevin',48) : Execution reussie
insert into personnes values ('Sylvie','Lefur',70) : Execution reussie
xx : Erreur ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx' at
 line 1"))
insert into personnes values ('Pierre','Nicazou',35) : Execution reussie
insert into personnes values ('Geraldine','Colou',26) : Execution reussie
insert into personnes values ('Paulette','Girond',56) : Execution reussie
il y a eu 1 erreur(s)
xx : Erreur ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx' at line 1"))

phpMyAdmin ile doğrulama:

Image

  • [1]'te, [Afficher] bağlantısı, [personnes] ve [2] tablolarının içeriğine erişim sağlar.

9.7. Herhangi bir SQL sorgusunun çalıştırılması

Aşağıdaki komut dosyası, bir SQL komut dosyasını çalıştırmaya ve her bir komutun sonucunu görüntülemeye olanak tanır:

  • komut SELECT ise, SELECT komutunun sonucu;
  • komut INSERT, UPDATE veya DELETE ise değiştirilen satır sayısı.

Program (mysqldb_05)


# MySQLdb modülünün içe aktarılması
import sys
sys.path.append("D:\Programs\ActivePython\site-packages")
import MySQLdb
# diğer modüller
import re

def cutNewLineChar(ligne):
    # varsa [ligne]'teki satır sonu işaretini siler
    l=len(ligne)
    while(ligne[l-1]=="\n" or ligne[l-1]=="\r"):
        l-=1
    return(ligne[0:l])

# ---------------------------------------------------------------------------------
def afficherInfos(curseur):
    # bir SQL sorgusunun sonucunu görüntüler
    # Bu bir SELECT sorgusu muydu?
    if curseur.description:
        # bir açıklama var - dolayısıyla bu bir SELECT sorgusudur
        # description[i], SELECT sorgusundaki i numaralı sütunun açıklamasıdır
        # descriptionQZXW2HTMLBW2ldZQXQZXW2HTMLBWzBdZQX, select'in i numaralı sütununun adıdır
        # alan adları görüntülenir
        titre=""
        for i in range(len(curseur.description)):
            titre+=curseur.description[i][0]+","
        # alan listesi son virgül olmadan görüntülenir
        print titre[0:len(titre)-1]
        # ayırıcı satır
        print "-"*(len(titre)-1)
        # seçim tablosunun geçerli satırı
        ligne=curseur.fetchone()
        while ligne:
            print ligne
            # seçim listesinin bir sonraki satırı
            ligne=curseur.fetchone()
    else:
        # alan yok - bu bir seçim listesi değildi
        print "%s lignes(s) a (ont) ete modifiee(s)" % (curseur.rowcount)


# ---------------------------------------------------------------------------------
def executerCommandes(HOTE,ID,PWD,BASE,SQL,suivi=False,arret=True):
    # bağlantıyı kullan (HOTE,ID,PWD,BASE)
    #, bu bağlantı üzerinden SQL metin dosyasında bulunan SQL komutlarını yürütür
    # bu dosya, her satırda bir tane olmak üzere çalıştırılacak SQL komut dosyasıdır
    # takip=1 ise, her bir SQL komutunun yürütülmesi sonrasında, komutun başarılı olup olmadığına dair bir mesaj görüntülenir
    # durdurma=1 ise, işlev karşılaşılan ilk hatada durur; aksi takdirde tüm SQL komutlarını yürütür
    # fonksiyon bir dizi döndürür (hata sayısı, hata1, hata2, ...)

    # SQL dosyasının varlığı kontrol edilir
    data=None
    try:
        data=open(SQL,"r")
    except:
        return [1,"Le fichier %s n'existe pas" % (SQL)]

    # bağlantı
    try:
        connexion=MySQLdb.connect(host=HOTE,user=ID,passwd=PWD,db=BASE)
    except MySQLdb.OperationalError,erreur:
        return [1,"Erreur lors de la connexion a MySQL sous l'identite (%s,%s,%s,%s) : %s" % (HOTE, ID, PWD, BASE, erreur)]
    
    # bir imleç talep edilir
    curseur=connexion.cursor()
    # SQL dosyasında bulunan SQL sorgularının yürütülmesi
    # bunlar bir tabloya ekleniyor
    requetes=data.readlines()
    # tek tek çalıştırılıyor - başlangıçta hata yok
    erreurs=[0]
    for i in range(len(requetes)):
        # geçerli sorguyu saklıyoruz
        requete=requetes[i]
        # Sorgu boş mu? Eğer öyleyse, bir sonraki sorguya geçilir
        if re.match(r"^\s*$",requete):
            continue
        # i sorgusunu çalıştırıyoruz
        erreur=""
        try:
            curseur.execute(requete)
        except Exception, erreur:
            pass
        #Bir hata oluştu mu?
        if erreur:
            # bir hata daha
            erreurs[0]+=1
            # hata mesajı
            msg="%s : Erreur (%s)" % (requete,erreur)
            erreurs.append(msg)
            # ekran izleme var mı, yok mu?
            if suivi:
                print msg
            # durulacak mı?
            if arret:
                return erreurs
        else:
            if suivi: 
                print "%s : Execution reussie" % (requete)
                # yürütülen isteğin sonucu hakkında bilgiler
                afficherInfos(curseur)

    # bağlantının kapatılması ve kaynakların serbest bırakılması
    curseur.close()
    connexion.commit()
    # bağlantı kesiliyor
    try:
        connexion.close()
    except MySQLdb.OperationalError,erreur:
        # bir hata daha
        erreurs[0]+=1
        # hata mesajı
        msg="%s : Erreur (%s)" % (requete,erreur)
        erreurs.append(msg)

    # geri dönüş
    return erreurs


# ---------------------------------------------- ana
# veritabanına bağlanılıyor MySQL
# kullanıcı kimliği
ID="admpersonnes"
PWD="nobody"
# veritabanı yönetim sisteminin ana bilgisayarı
HOTE="localhost"
# veritabanı kimliği
BASE="dbpersonnes"
# çalıştırılacak SQL komut metin dosyasının kimliği
TEXTE="sql2.txt"


# tablonun oluşturulması ve doldurulması
erreurs=executerCommandes(HOTE,ID,PWD,BASE,TEXTE,True,False)
# hata sayısının görüntülenmesi
print "il y a eu %s erreur(s)" % (erreurs[0])
for i in range(1,len(erreurs)):
    print erreurs[i]

Notlar:

  • yeni değişiklik, komut dosyasının 100. satırında yer almaktadır: SQL komutunun yürütülmesinden sonra, bu sorgu tarafından kullanılan imleçle ilgili bilgiler istenir. Bu bilgiler, 16-40. satırlardaki afficheInfos işlevi tarafından sağlanır;
    1. ve 39. satırlar: eğer yürütülen SQL sorgusu bir SELECT olsaydı, [curseur.description] özniteliği, i numaralı elemanı SELECT sonucundaki i numaralı alanı tanımlayan bir dizidir. Aksi takdirde, [curseur.rowcount] özniteliği (satır 39), INSERT, UPDATE veya DELETE sorguları tarafından değiştirilen satır sayısını gösterir;
    1. ve 36. satırlar: [curseur.fetchone] yöntemi, SELECT'ten geçerli satırı almayı sağlar. Bunları tek seferde alabilen [curseur.fetchall] yöntemi de mevcuttur.

Sonuçlar

Çalıştırılan isteklerin dosyası:

1
2
3
4
5
6
7
8
9
select * from personnes
select nom,prenom from personnes order by nom asc, prenom desc
select * from personnes where age between 20 and 40 order by age desc, nom asc, prenom asc
insert into personnes values('Josette','Bruneau',46)
update personnes set age=47 where nom='Bruneau'
select * from personnes where nom='Bruneau'
delete from personnes where nom='Bruneau'
select * from personnes where nom='Bruneau'
xselect * from personnes where nom='Bruneau'

Ekran sonuçları:

select * from personnes : Execution reussie
prenom,nom,age
---------------
('Geraldine', 'Colou', 26L)
('Paulette', 'Girond', 56L)
('Paul', 'Langevin', 48L)
('Sylvie', 'Lefur', 70L)
('Pierre', 'Nicazou', 35L)
select nom,prenom from personnes order by nom asc, prenom desc : Execution reussie
nom,prenom
-----------
('Colou', 'Geraldine')
('Girond', 'Paulette')
('Langevin', 'Paul')
('Lefur', 'Sylvie')
('Nicazou', 'Pierre')
select * from personnes where age between 20 and 40 order by age desc, nom asc,prenom asc : Execution reussie
prenom,nom,age
---------------
('Pierre', 'Nicazou', 35L)
('Geraldine', 'Colou', 26L)
insert into personnes values('Josette','Bruneau',46) : Execution reussie
1 lignes(s) a (ont) ete modifiee(s)
update personnes set age=47 where nom='Bruneau' : Execution reussie
1 lignes(s) a (ont) ete modifiee(s)
select * from personnes where nom='Bruneau' : Execution reussie
prenom,nom,age
---------------
('Josette', 'Bruneau', 47L)
delete from personnes where nom='Bruneau' : Execution reussie
1 lignes(s) a (ont) ete modifiee(s)
select * from personnes where nom='Bruneau' : Execution reussie
prenom,nom,age
---------------
xselect * from personnes where nom='Bruneau' : Erreur ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xselect * from personnes where nom='Bruneau'' at line 1"))

PhpMyadmin kontrolü: