Sunteți pe pagina 1din 7

Seminar 2 – Prelucrarea datelor în Python.

Connexiunea cu Oracle Database

Conectarea la baze de date Oracle – pachetul cx_Oracle


Pachetul cx_Oracle conține metode pentru realizarea unei conexiuni cu o bază de date
Oracle, pentru gestiunea interogărilor și a tranzacțiilor (comenzile
SELECT/INSERT/UPDATE/DELETE/MERGE și COMMIT/ROLLBACK).

Configurarea pachetului cx_Oracle. În sălile de seminar mediul de lucru este configurat


corespunzător.

Pachetul se instalează utilizând utilitarul pip:


python -m pip install cx_Oracle --upgrade

Pentru realizarea conexiunii este necesară instalarea clientului Oracle Client 12c
(https://www.oracle.com/database/technologies/instant-client/downloads.html). Versiunea de
Oracle Client trebuie să corespundă versiunii de Oracle Database (a se vedea lista de
compatibilități pe site-ul Oracle) dar și versiunii de Python instalată (32 sau 64 biți).
Instrucțiunile sunt detaliate aici: https://cx-
oracle.readthedocs.io/en/latest/user_guide/installation.html

Pentru realizarea conexiunii cu o bază de date Oracle se precizează userul, parola,


serverul (host/ip) și denumirea bazei de date (service name/SID). De exemplu, pentru
realizarea conexiunii cu serverul oracle care rulează pe IP-ul 37.120.250.20 cu
SERVICE_NAME oracle, nume utilizator student_ps și parola oracle se inițializează
conexiunea următoare:

connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")

Pentru gestiunea interogărilor sau a tranzacțiilor este necesară utilizarea unui cursor:
cursor = connection.cursor()

Obiectul de tip cursor dispune de toate metodele necesare gestiunii tranzacțiilor și procesării
interogărilor.
Metoda Explicații

cursor.execute(comanda Execută comanda SQL specificată împreună cu lista de


SQL, parametri)
parametrii. Ca rezultat, în cazul SELECT cursorul este
încărcat cu înregistrările returnate

cursor.close() Închide cursorul și eliberează zona de memorie alocată

cursor.fetchone() Încarcă înregistrările din cursor în variabile locale Python


cursor.fetchmany(n) (de obicei în liste de tupluri)
cursor.fetchall()

cursor.prepare(comanda Transmite comanda SQL către cursor fără a o executa

1
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database

SQL)

cursor.rowcount Returnează numărul de înregistrări parcurse din cursor,


inițial este 0, iar pe măsură ce se utilizează comanda fetch(),
numărul crește.

cursor.bindarraysize Precizează dimensiunea cursorului, uilizată în special la


comanda INSERT

cursor.setinputsizes() Precizează tipurile de date ale parametrilor, uilizată în


special la comanda INSERT

Lista completă a metodelor acestuia este disponibilă aici: https://cx-


oracle.readthedocs.io/en/latest/

Realizarea interogărilor
Pentru exemplificare se utilizează tabelele T_CLIENTI_DAUNE și T_CLIENTI_LEASING
din schema utilizatorului STUDENT_PS.
Vă conectați în SQL Developer utilizând următoarele informații:
Connection Name: Seminar 2

Username: student_ps

Parola: oracle

Server
Host: 37.120.250.20
Port 1521
Service_name: oracle

Vizualizați tabelele T_CLIENTI_DAUNE și T_CLIENTI_LEASING.

Instrucțiunile SELECT sunt executate în cadrul cursorului astfel:


cursor.execute("""SELECT * FROM t_clienti_leasing""")

Cursorul este încărcat cu tuplurile returnate de interogare, parcurgerea putând fi realizată


astfel:

for rec in cursor:


print("Values:", rec)

După prelucrarea cursorului se recomandă închiderea sa, iar la final închiderea conexiunii cu
baza de date:
cursor.close()
connection.close()

2
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database

Pentru prelucrarea unui cursor se pot utiliza listele de tupluri, înregistrările putând fi încărcate
cu ajutorul metodelor cursorului:
- fetchone() – încarcă o singură înregistrare;
- fetchmany(n) – încarcă n înregistrări;
- fetchall() - încarcă toate înregistrările din cursor.

Exemplul 1. Să se returneze numele, profesia și venitul anual al clientilor care au solicitat


pentru creditare mai mult de 5000 lei.
import cx_Oracle
from pprint import pprint

# Realizarea conexiunii cu serverul Oracle


#Conexiunea - user student_ps, parola oracle, host:37.120.250.20, service_name
oracle
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
cursor = connection.cursor()
cursor.execute("""SELECT nume_client, profesia, venit_anual FROM
t_clienti_leasing where suma_solicitata>5000""")
lista_clienti=cursor.fetchall()
#inchidere cursor si conexiune
cursor.close()
connection.close()
#afisare lista clienti
pprint (lista_clienti)

Interogări cu parametrii
Parametrii se pot sepcifica direct în cadrul metodei execute() sub forma
cursor.execute(comanda SQL, parametri). În cadrul interogării, parametrii se specific
sub forma :param.
Exemplul 2. Să se returneze valoarea totală a daunelor înregistrate pentru o anumită marcă
auto introdusă de utilizator de la tastatură.
import cx_Oracle
from pprint import pprint

# Realizarea conexiunii cu serverul Oracle


#Conexiunea - user student_ps, parola oracle, hostȘ37.120.250.20, service_name
oracle
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
cursor = connection.cursor()
v_marca = input("Introduceti marca: ");
cursor.execute("""SELECT marca, sum(valoare_dauna) Total_daune FROM
t_clienti_daune where lower(marca) like :p_marca group by marca""",
p_marca='%'+v_marca.lower()+'%')
lista_daune=cursor.fetchall()
#inchidere cursor si conexiune
cursor.close()
connection.close()
#afisare lista marci cu daune
pprint (lista_daune)

3
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database

Gestiunea tranzacțiilor
Operațiile DML (INSERT, UPDATE și DELETE) sunt realizate tot prin intermediul unui
cursor cu ajutorul metodei execute() sub forma cursor.execute(comanda SQL
INSERT/UPDATE/DELETE, parametri).

În cazul INSERT, se pot transmite mai multe înregistrări prin metoda executemany(). În aest
caz se recomandă să se precizeze numărul de înregistrări prin proprietatea bindarraysize și
tipul parametrilor prin metoda setinputsizes.
Tranzacțiile se pot finaliza sau anula prin precizarea opțiunilor COMMIT sau ROLLBACK
ale conexiunii: connection.commit() sau connection.rollback()
Exemplul 3. Să se adauge o listă de tupluri în tabela CLIENTI_NOI care are următoarea
structură: id_client number, nume_client varchar2(150), profesia varchar2(150), sex
varchar2(3), varsta number, stare_civila varchar2(1),suma_solicitata number.

Să se finalizeze tranzacția și apoi să se returneze înregistrările noi adăugate.

Modificați secvența de cod și anulați tranzacția.


import cx_Oracle
from pprint import pprint

# Realizarea conexiunii cu serverul Oracle


#Conexiunea - user student_ps, parola oracle, host 37.120.250.20, service_name
oracle
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")

lista_clienti_noi = [(100, "Popa Marcel", "Inginer", "m", 34, "C", 230),


(101, "Popa Vasilica", "Coafeza", "f", 32, "C", 200),
(102, "Popa Ion", "Instalator", "m", 64, "C", 120)]

cursor = connection.cursor()
#adaugarea listei de clienti noi in tabela
cursor.bindarraysize = 3
cursor.setinputsizes(int, 150, 150, 3, int, 1, float)
cursor.executemany("insert into clienti_noi(id_client, nume_client, profesia,
sex, varsta, stare_civila,suma_solicitata) values (:1, :2, :3, :4, :5, :6, :7)",
lista_clienti_noi)
cursor.close()
#finalizarea tranzactiei
connection.commit()

#interogarea bazei de date pentru vizualizarea inregistrarilor noi adaugate


cursor2 = connection.cursor()
cursor2.execute("""SELECT * from clienti_noi where nume_client like 'Popa%'""")
lista_clienti=cursor2.fetchall()
pprint(lista_clienti)
cursor2.close()
connection.close()

Actualizarea înregistrărilor se realizează cu comanda SQL UPDATE precizată în sub forma


cursor.execute(comanda SQL UPDATE, parametri).
Exemplul 4. Să se majoreze cu 10% suma solicitată de clienții al căror nume este introdus
de utilizator de la tastatură. Actualizările se vor realiza pe tabela tabela CLIENTI_NOI.
Să se finalizeze/anuleze tranzacția și să se re-deschidă un cursor pentru verificarea
rezultatelor tranzacției.
import cx_Oracle

4
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database

from pprint import pprint


# Realizarea conexiunii cu serverul Oracle
#Conexiunea - user student_ps, parola oracle, host 37.120.250.20, service_name
oracle
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")

cursor = connection.cursor()
#precizarea instructiunii update cu parametru
statement="update clienti_noi set suma_solicitata=suma_solicitata*1.10 where
lower(nume_client) like :p_nume"

v_nume=input("Introduceti numele clientului:")


cursor.execute(statement,p_nume='%'+v_nume.lower()+'%')
cursor.close()

#finalizarea tranzactiei
connection.commit()

#interogarea bazei de date pentru vizualizarea inregistrarilor noi adaugate


cursor2 = connection.cursor()
cursor2.execute("""SELECT * from clienti_noi where lower(nume_client) like
:p_nume""", p_nume='%'+v_nume.lower()+'%')
lista_clienti=cursor2.fetchall()
pprint(lista_clienti)
cursor2.close()
connection.close()

Ștergerea înregistrărilor se realizează cu comanda SQL DELETE precizată în sub forma


cursor.execute(comanda SQL DELETE, parametri).

Exemplul 5. Să se șteargă din tabela CLIENTI_NOI clienții cu numele de familie Popa.


Să se finalizeze tranzacția.
import cx_Oracle
# Realizarea conexiunii cu serverul Oracle
#Conexiunea - user student_ps, parola oracle, host 37.120.250.20, service_name
oracle
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")

cursor = connection.cursor()
#stergerea clientilor cu numele Popa
statement="delete from clienti_noi where nume_client like 'Popa%'"
cursor.execute(statement)
cursor.close()
#finalizarea tranzactiei
connection.commit()
connection.close()

Utilizarea pachetului Pandas pentru interacțiunea cu baza de date Oracle


Înregistrările returnate de o interogare SQL se pot încărca direct într-un DataFrame Pandas
prin metoda pandas.read_sql(comanda SQL, conexiunea, lista de parametrii).
În acest caz nu mai este necesară încărcarea înregistrărilor în cursor, acestea fiind gestionate
automat de către DataFrame.
Exemplul 6. Să se selecteze din tabela T_CLIENTI_DAUNE marca, modelul, anul de
fabricație, componenta, prețul manoperei și valoarea daunei pentru autoturismele mai noi
de 2010.
import pandas as pd
import cx_Oracle
from pprint import pprint

# Connect to oracle.
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")

5
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database

#incarcam in DataFrame inregistrarile returnate de SELECT


an=2010
query ="""Select marca, model, an_fabricatie, componenta, pret_manopera,
valoare_dauna
from t_clienti_daune
where an_fabricatie>:an"""
df = pd.read_sql(query, con=connection, params={'an': an})
pprint(df)

connection.close()

Exemplul 7. În exemplul de mai sus să se adauge o nouă coloană în df pentru a calcula


ponderea manoperei din valoarea totală a daunei. Să se afișeze marca și componentele
înlocuite în cazul în care ponderea manoperei depășește 30% din valoarea daunei.
import pandas as pd
import cx_Oracle
from pprint import pprint

# Connect to oracle.
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")

#incarcam in DataFrame inregistrarile returnate de SELECT


an=2010
query ="""Select marca, model, an_fabricatie, componenta, pret_manopera,
valoare_dauna
from t_clienti_daune
where an_fabricatie>:an"""
df = pd.read_sql(query, con=connection, params={'an': an})
connection.close()

df["PROCENT"]=df["VALOARE_DAUNA"]/df["PRET_MANOPERA"]
pprint(df.loc[(df["PROCENT"]>30), ["MARCA","COMPONENTA"]])

1.

6
Seminar 2 – Prelucrarea datelor în Python. Connexiunea cu Oracle Database

Referințe
1 Using Python with Oracle Database 11g

- https://www.oracle.com/technetwork/articles/dsl/python-091105.html

2 Developing a Python Web Application with Oracle Database 11g

https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/OOW11/python_djang
o/python_django.htm

3 https://learncodeshare.net/2015/06/26/insert-crud-using-cx_oracle/

4 https://cx-oracle.readthedocs.io/en/latest/user_guide/sql_execution.html

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