0% au considerat acest document util (0 voturi)
13 vizualizări

curs9_Python_pymysql

Încărcat de

myvali2004
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
13 vizualizări

curs9_Python_pymysql

Încărcat de

myvali2004
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 11

Python – manipularea bazelor de date folosind biblioteca pymysql

Se folosește biblioteca pymysql


• https://pymysql.readthedocs.io/en/latest/,
• https://github.com/PyMySQL/PyMySQL

O alta biblioteca similara este MySQLdb.

1. Conexiunea la o bază de date MySQL în Python


Pentru a putea crea o conexiune la o bază de date MySQL în Python, trebuie instalata si
importata biblioteca 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.

1. Prima etapă se realizează cu ajutorul metodei connect(), ce primește următorii parametri:


- host: numele sistemului (domeniului) unde rulează serverul MySQL. Poate fi un nume sau o
adresă IP. Dacă nu este specificat, atunci va primi implicit valoare localhost.
- user: id-ul utilizatorului care trebuie sa fie autentificat. Valoarea implicită este user-ul curent
(de cele mai multe ori, root).
- passwd: parola
- db: baza de date
- port: portul prin care se permite accesul la serverul MySQL. Valoarea implicită este 3306.

Exemplu:

db= pymysql.connect(host=”Demo”, user=”root” , passwd=”adm1n”, db=”test”)

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()

3. Execuția interogărilor SQL

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.

cursor.execute(“select * from table”)

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]

O altă variantă ar fi utilzarea funcției fetchall():

result = cursor.fetchall()

for record in result:


print record[0] , "=", record[1]

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ă:

Scriptul principal, unde sunt importate toate celelalte scripturi, aplicatie.py

#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

#Rularea modulelor in functie de optiune


opt = ""
while opt != "6":
opt = Menu()
if opt == "1":
os.system('cls')
adaugare.MeniuAdaugaDVD()
elif opt == "2":
os.system('cls')
cautare.MeniuCautaDVD()
elif opt == "3":
os.system('cls')
modificare.MeniuModificaDVD()
elif opt == "4":
stergere.MeniuStergeDVD()
elif opt == "5":
export.ExportCSV()

Scriptul dbConnection unde este creată conexiunea la baza de date:

3
#dbConnection.py

# Cele mai importante module Python DB API

# MySQL - MySQLdb
# PostrgeSQL - psycopg(2)
# SQLite - sqlite3
# Oracle - oracle
# MS SQL server - adodbapi

import pymysql

# variabile pentru accesul la baza de date


HOST = 'localhost'
USER = 'root'
PASSWD = 'root'
DATABASE = 'test1'

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')

#print "Conexiunea la baza de date s-a realizat cu succes!"


return db
except Exception, e:
print "Eroare la conexiunea cu baza de date! - ", e

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()

Scriptul de adăugare a unei înregistrări noi, este prezentat mai jos:

#adaugare.py

import dbConnection

#Executa o interogare SQL pentru a adauga in baza de date


def AdaugaDVD(titlu, actorPrincipal, actorSecundar, an, gen):
sqlInsert = 'INSERT INTO dvd values ("%s", "%s", "%s", "%s", "%s")' % (titlu,
actorPrincipal, actorSecundar, an, gen)
try:
db=dbConnection.CreeazaConexiune()
c=db.cursor()
try:
c.execute(sqlInsert)
except Exception, e:
print "Eroare: ",e
db.commit()
c.close()
db.close()
raw_input("Inregistrarea a fost adaugata cu success - apasati 'Enter'
pentru a continua: ")
except:
print "Eroare la adaugarea in baza de date"
raw_input("Apasati 'Enter' pentru a continua.")

#Afiseaza meniul pentru adaugarea in baza de date


def MeniuAdaugaDVD():
print "==============================="
print "Adaugare DVD in baza de date:"
print "==============================="
titlu = raw_input("Introduceti titlul filmului: ")
actorPrincipal = raw_input("Introduceti numele actorului din rolul principal:
")
actorSecundar = raw_input("Introduceti numele actorului din rolul secundar:
")
an = raw_input("Introduceti anul aparitiei: ")
gen = raw_input("Introduceti genul filmului:\n - 1 - Drama, 2 - Horror, 3 -
Comedie, 4 - Romantic: ")
if gen == "1":
gen = "Drama"
elif gen == "2":
gen = "Horror"
elif gen == "3":
gen = "Comedie"
elif gen == "4":
gen = "Romantic"
else:
print "Ati introdus informatii gresite!"
raw_input("Apasati 'Enter' pentru a va intoarce la meniu.")
return

AdaugaDVD(titlu, actorPrincipal, actorSecundar, an, gen)

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 "==============================="

titluDVD = raw_input("\n Introduceti titlul filmului pe care doriti sa-l


modificati: ")

querrySelectTitlu = "SELECT * FROM dvd WHERE titlu = \"%s\"" % titluDVD

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 "==============================="

opt = raw_input("Introduceti numele campului pe care doriti sa-l


modificati, si apasati 'Enter': ")

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"

optiune = raw_input("Introduceti noua valoare pentru genul filmului:


")
if optiune == "1":
nouaValoare = "\"Drama\""
elif optiune == "2":
nouaValoare = "\"Horror\""
elif optiune == "3":
nouaValoare = "\"Comedie\""
elif optiune == "4":
nouaValoare = "\"Romantic\""

querryUpdate = "UPDATE dvd SET %s = %s WHERE titlu = \"%s\"" %


(campModificat, nouaValoare, titluDVD)

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

#Executa o interogare pentru cautare in baza de date


def CautaDVD(campCautare, textCautare):
querrySelect = "SELECT * FROM dvd WHERE %s = %s" % (campCautare, textCautare)
try:
db=dbConnection.CreeazaConexiune()
c=db.cursor()
try:
c.execute(querrySelect)
except Exception, e:
print e
output = c.fetchall()
c.close()
db.close()
except:
print "Eroare la conexiunea cu baza de date! ", e
raw_input("Apasati tasta 'Enter' pentru a continua.")
return

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: ")

#Afiseaza meniul pentru a cauta in baza de date


def MeniuCautaDVD():
print """
===============================
Alegeti criteriul de cautare:
1 - Dupa titlu
2 - Dupa actorul principal
3 - Dupa actorul secundar
4 - Dupa an
5 - Dupa gen"""
opt = raw_input("\nIntroduceti optiunea si apasati 'Enter': ")

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)

Ștergerea unei înregistrări:

#stergere.py

import pymysql, os, dbConnection

# Executa o interogare SQL pentru stergerea din baza de date


def StergeDVD(dvdStergere):
try:
queryDelete = 'DELETE FROM dvd WHERE titlu = %s' % dvdStergere
db = dbConnection.CreeazaConexiune()
c = db.cursor()
c.execute(queryDelete)
db.commit()
c.close()
db.close()

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.")

# Afisare meniu stergere


def MeniuStergeDVD():
os.system('cls')
print "==============================="
print "Sterge inregistrare"
print "==============================="
campCautare="titlu"
dvdStergere = raw_input("\nIntroduceti titlul DVD-ului pe care doriti sa-l
stergeti:\t")
dvdStergere = "\"%s\"" % (dvdStergere)
querySelect = "SELECT * FROM dvd WHERE %s = %s" % (campCautare,dvdStergere)
try:
db = dbConnection.CreeazaConexiune()
c = db.cursor()
c.execute(querySelect)
searchResult = c.fetchall()
# if searchResult[0] == ():
# raise
except:
print "Eroare la accesarea inregistrarii in baza de date!"
raw_input("Apasati 'Enter' pentru a continua.")
return

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.")

Exportul în format CSV:


import MySQLdb, csv, os, dbConnection

#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

S-ar putea să vă placă și