curs9_Python_pymysql
curs9_Python_pymysql
import pymysql
Pentru accesarea datelor din tabelele unei baze de date MySQL, din Python, sunt necesari 4 pași:
1. Crearea conexiunii cu baza de date
2. Crearea unui obiect numit cursor
3. Execuția interogărilor SQL
4. Manipularea setului de date rezultat în urma interogărilor.
Exemplu:
2. Crearea cursorului:
În ceea ce privește bazele de date, cursorul reprezintă zona de memorie alocată în urma unei
interogări asupra bazei de date. Pentru a crea un cursor se apelează metoda cursor() asupra
conexiunii.
cursor= db.cursor()
Interogările de tip SQL pot fi executate cu ajutorul metodei execute() din clasa Cursor.
Interogarea este transmisă sub formă de string, iar rezultatul interogării va fi stocat în obiectul cursor.
1
4. Extragerea setului de date stocat în obiectul cursor
Clasa Cursor pune la dispoziție două funcții pentru manipularea datelor extrase într-un obiect
de tip cursor: fetchone() și fetchall(). Prima funcție returnează o singură înregistrare sub formă de
tuplu Python. Toate tipurile de date rezultate sunt automat mapate în tipurile de date Python, cu
excepția tipului unsigned integer care este mapat către tipul long.
numrows = int(cursor.rowcount)
for x in range(0,numrows):
row = cursor.fetchone()
print row[0], "-->", row[1]
result = cursor.fetchall()
2
2. Exemplu de aplicație Python cu conexiune la o bază de date MySQL
Aplicația permite accesul la o bază de date în care sunt stocate informații despre o colecție de
DVD-uri cu filme, precum: titlul filmului, actorul din rolul principal, actorul din rolul secundar, anul
apariției și genul filmului. Sunt permise operațiile de adăugare în baza de date, de căutare după mai
multe criterii, de modificare a înregistrărilor, de ștergere și de export în format CSV.
Aplicația este structurată sub forma mai multor scripturi, după cum urmează:
#aplicatie.py
import os
import adaugare
import cautare
import modificare
import stergere
import export
#Meniul principal
def Menu():
os.system('cls')
print """
================================
1 - Adauga in baza de date
2 - Cauta in baza de date
3 - Modifica inregistrare
4 - Sterge inregistrare
5 - Export in format CSV
6 - Iesire
================================
"""
opt = raw_input("Introduceti optiunea si apasati 'Enter': ")
return opt
3
#dbConnection.py
# MySQL - MySQLdb
# PostrgeSQL - psycopg(2)
# SQLite - sqlite3
# Oracle - oracle
# MS SQL server - adodbapi
import pymysql
def CreeazaConexiune():
# creeaza o conexiune la baza de date
try:
#db = pymysql.connect(host=HOST, user=USER, db=DATABASE)
db = pymysql.connect(host='localhost', port=3306, user='root',
passwd='root', db='test1')
def CreeazaBazaDeDate():
# creeaza baza de date
db = CreeazaConexiune()
if db == None:
try:
db = pymysql.connect(host=HOST, port=3306, user=USER, passwd=PASSWD)
db.cursor().execute('CREATE DATABASE ' + DATABASE)
except Exception as e:
print("Eroare la crearea bazei de date!", e)
def CreeazaTabela():
# creeaza tabel
db=CreeazaConexiune()
# pentru a executa interogari asupra bazei de date este nevoie de un obiect
de tip cursor
cursor=db.cursor()
cursor.execute('USE ' + DATABASE)
cursor.execute("""
CREATE TABLE dvd(
titlu Varchar(100),
actor_principal VARCHAR(100),
actor_secundar VARCHAR(100),
an INT,
gen VARCHAR(100)
)
""")
db.commit()
cursor.close()
4
db.close()
CreeazaConexiune()
#adaugare.py
import dbConnection
5
Modificarea unei înregistrări este realizată în scriptul următor:
#modificare.py
#modificare.py
import dbConnection
def MeniuModificaDVD():
print "==============================="
print "Modificare inregistrare in baza de date:"
print "==============================="
try:
db = dbConnection.CreeazaConexiune()
c = db.cursor()
c.execute(querrySelectTitlu)
rezultat = c.fetchall()
#if rezultat[0] == ():
# raise
except:
print "Eroare la accesarea inregistrarii in baza de date!"
raw_input("Apasati 'Enter' pentru a continua.")
return
try:
print "==============================="
print "Filmul care va fi modificat:"
print "==============================="
print "1 - Titlu:\t", rezultat[0][0]
print "2 - Actor principal:\t", rezultat[0][1]
print "3 - Actor secundar:\t", rezultat[0][2]
print "4 - An:\t", rezultat[0][3]
print "5 - Gen:\t", rezultat[0][4]
print "==============================="
titluModificat = False
campModificat = ""
nouaValoare = ""
if opt == "1":
campModificat = "titlu"
nouaValoareTitlu = raw_input("Introduceti noul titlu: ")
nouaValoare = "\"%s\"" % nouaValoareTitlu
titluModificat = True
elif opt == "2":
campModificat = "actor_principal"
6
nouaValoare = raw_input("Introduceti noul nume pentru actorul
principal: ")
nouaValoare = "\"%s\"" % nouaValoare
elif opt == "3":
campModificat = "actor_secundar"
nouaValoare = raw_input("Introduceti noul nume pentru actorul
secundar: ")
nouaValoare = "\"%s\"" % nouaValoare
elif opt == "4":
campModificat = "an"
nouaValoare = raw_input("Introduceti anul: ")
nouaValoare = "\"%s\"" % nouaValoare
elif opt == "5":
campModificat = "gen"
print "==============================="
print "Alegeti genul pe care doriti sa-l modificati:"
print "1 - Drama"
print "2 - Horror"
print "3 - Comedy"
print "4 - Romance"
db = dbConnection.CreeazaConexiune()
c = db.cursor()
c.execute(querryUpdate)
db.commit()
if titluModificat:
querrySelect = "SELECT * FROM dvd WHERE titlu = \"%s\"" %
nouaValoareTitlu
c = db.cursor()
c.execute(querrySelect)
rezultatModificare = c.fetchall()
c.close()
db.close()
except:
print "Eroare la modificare inregistrarii!"
raw_input("Apasati 'Enter' pentru a continua.")
return
print "==============================="
print "Intregistrare modificata:"
print "==============================="
print "1 - Titlu:\t", rezultatModificare[0][0]
print "2 - Actor principal:\t", rezultatModificare[0][1]
print "3 - Actor secundar:\t", rezultatModificare[0][2]
print "4 - An:\t", rezultatModificare[0][3]
print "5 - Gen\t", rezultatModificare[0][4]
7
print "==============================="
raw_input("Apasati 'Enter' pentru a continua.")
Căutarea se poate face după mai multe criterii, așa cum este prezentată în următorul script:
#cautare.py
import pymysql, os
import dbConnection
os.system('cls')
print "==============================="
print "Cautare DVD in baza de date:"
print "==============================="
if output == ():
print "Nu a fost gasita nicio inregistrare!"
print "==============================="
for entry in output:
print "Titlu:\t", entry[0]
print "Actor principal:\t", entry[1]
print "Actor secundar:\t", entry[2]
print "An:\t", entry[3]
print "Gen:\t", entry[4]
print "==============================="
raw_input("\n\nApasati 'Enter' pentru a continua: ")
8
campCautare = ""
textCautare = ""
if opt == "1":
campCautare = "titlu"
textCautare = raw_input("Introduceti titlul filmului: ")
textCautare = "\"%s\"" % (textCautare)
elif opt == "2":
campCautare = "actor_principal"
textCautare = raw_input("Introduceti numele actorului principal: ")
textCautare = "\"%s\"" % (textCautare)
elif opt == "3":
campCautare = "actor_secundar"
textCautare = raw_input("Introduceti numele actorului secundar: ")
textCautare = "\"%s\"" % (textCautare)
elif opt == "4":
campCautare = "an"
textCautare = int(raw_input("Introduceti anul: "))
elif opt == "5":
campCautare = "gen"
print """
Introduceti genul:
1 - Drama
2 - Horror
3 - Comedie
4 - Romantic
"""
optiuneGen = raw_input("\t")
if optiuneGen == "1":
textCautare = "\"Drama\""
elif optiuneGen == "2":
textCautare = "\"Horror\""
elif optiuneGen == "3":
textCautare = "\"Comedie\""
elif optiuneGen == "4":
optiuneGen = "\"Romantic\""
else:
print "Ati introdus date gresite!"
raw_input("Apasati 'Enter' pentru a reveni la meniu.")
return
CautaDVD(campCautare, textCautare)
#stergere.py
9
raw_input("Inregistrarea a fost stearsa cu success! Apasati 'Enter' pentru
a continua.")
except:
print "Eroare la stergerea inregistrarii"
raw_input("Apasati 'Enter' pentru a continua.")
print "==============================="
print "Informatii despre DVD care va fi sters"
print "==============================="
print "Titlu:\t", searchResult[0][0]
print "Actor principal:\t", searchResult[0][1]
print "Actor secundar:\t", searchResult[0][2]
print "An:\t", searchResult[0][3]
print "Gen:\t:", searchResult[0][4]
print "==============================="
print """
Sunteti sigur ca doriti sa stergeti DVD-ul? \n
Introduceti optiunea si apasati 'Enter' (D/d = da, Orice altceva = Nu)
"""
opt = raw_input("\t")
if (opt == "D" or opt == "d"):
StergeDVD(dvdStergere)
else:
c.close()
db.close()
raw_input("Inregistrarea NU a fost stearsa! Apasati 'Enter' pentru a
continua.")
#export.py
import dbConnection
import csv, os
10
#Exporta baza de date in format CSV
def ExportCSV():
querrySelect = "SELECT * FROM dvd"
try:
db = dbConnection.CreeazaConexiune()
c = db.cursor()
c.execute(querrySelect)
output = c.fetchall()
c.close()
db.close()
except:
print "Eroare la conexiunea cu baza de date!"
raw_input("Apasati 'Enter' pentru a reveni la meniu.")
return
try:
os.system('cls')
print "==============================="
print "Exporta baza de date in format CSV:"
print "==============================="
filename = raw_input("Introduceti numele fisierului (fara extensia .csv):
")
filename = filename + ".csv"
writer = csv.writer(open(filename, "w"))
writer.writerow(("TITLU", "ACTOR PRINCIPAL", "ACTOR SECUNDAR", "AN",
"GEN"))
writer.writerows(output)
print filename, "Baza de date a fost exportata cu succes, apasati 'Enter'
pentru a continua."
raw_input("")
return
except:
print "Eroare la scrierea fisierului!"
raw_input("Apasati 'Enter' pentru a reveni la meniu")
11