Si te lidhet Python me SQL Server, dhe si te manipulojme me shenime

Ne kete artikull do te mundohem te pershkruaj dhe sqaroj se si behet nderlidhja ne mes te platformes SQL Server me Python, dhe si te manipulojme me shenime te cilat gjenden ne databazat perkatese, mirepo deshirojme ato shenime t’i nxjerrim apo lexojme ne Python IDE. Normalisht pervec leximit te te dhenave nga databaza ne Python, mund te bejme edhe regjistrimin, perditesimin dhe fshirjen e shenimeve nga Python, e me pas ato shenime pasqyrohen ne/nga databazat perkatese qe gjenden ne SQL Server.

Per te mundesuar lidhjen e Python me SQL Server, se pari duhet ta instalojme dhe perdorim paketen pyodbc, e cila mundeson komunikimin ndermjet Python dhe SQL Serverit (gjithashtu edhe me platformat tjera, sic jane psh: Oracle, mysql, etj).

Instalimi i paketes pyodbc

Per te instaluar dhe me pas per ta importuar paketen pyodbc ne Python, duhet t’i ndjekim disa hapa, te cilat do t’i pershkruaj ne vazhdim. Pra, instalimi i paketes pyodbc behet duke perdore PIP (package manager ose package management system).

Po supozojme qe jemi duke perdore sistemin operativ Windows ne kompjuterin tone, me c’rast instalimi i nje pakete te Python-it behet duke hapur Command Prompt, dhe me pas shenohen komandat ne vijim:

pip install package_name

Ne rastin tone konkret, pasi te hapet Command Prompt, navigojme ne shtegun: C:\Users\mentor\AppData\Local\Programs\Python\Python310\Scripts, dhe me pas shenohet pip install pyodbc, sic eshte treguar meposhte:

C:\Users\mentor\AppData\Local\Programs\Python\Python310\Scripts\pip install pyodbc

Pasi te ekzekutohen keto komanda, rezultati do te jete si ne vijim:

Pra, pasi eshte bere instalimi i paketes pyodbc, tani plotesohen parakushtet qe te vazhdojme me lidhjen e Python me SQL Server, si dhe te behen manipulimet e duhura qe kane te bejne me shenimet qe gjenden ne databaze.

Leximi i te dhenave nga databaza ne SQL Server

Sintaksa e pergjithshme per leximin e shenimeve nga nje databaze, e qe duhet te shkruhet ne gjuhen programuese Python eshte si meposhte:

ku:

  • server_name eshte emri i serverit.
  • database_name eshte emri i databazes.
  • table_name eshte emri i tabeles.

Shembuj konkret si behet manipulimi i shenimeve nga databaza permes Python IDE

Meposhte do t’i pershkruaj disa shembuj konkret se si lexohen, regjistrohen, perditesohen, dhe fshihen shenimet (CRUD operacionet) nga databaza me emrin KlientetDB (e cila ekziston ne SQL Server), perkatesisht nga tabela Klientet qe permbane informatat e klienteve.

Gjithashtu le te supozojme qe kemi te instaluar nje database server ne kompjuterin tone me emrin mentor-pc, ku per nevoja testimi le te jete SQL Server Express Edition qe do te thote se emri i instances (default) eshte sqlexpress.

Leximi i shenimeve

Le te supozojme qe deshirojme t’i lexojme dhe nxjerrim informatat e klienteve qe gjenden ne tabelen Klientet.
Informatat e klienteve qe gjenden ne databazen e SQL Serverit jane si meposhte:

te cilat jane nxjerre duke perdore SSMS (Management Studio).

Kurse sintaksa e duhur per leximin e shenimeve nga tabela Klientet ne Python IDE eshte si ne vijim:

Pasi ta ekzekutojme sintaksen e mesiperme, do t’i shohim te gjithe klientet qe gjenden ne tabelen Klientet nga databaza e SQL Serverit, me c’rast rezultati do te jete si meposhte:

Regjistrimi i shenimeve

Le te supozojme tani qe deshirojme t’i regjistrojme disa klient te ri permes Python, atehere sintaksa e duhur per regjistrimin e klienteve ne tabelen Klientet eshte si ne vijim:

Pasi ta ekzekutojme sintaksen e mesiperme, nese shikojme rezultatet ne databaze permes SSMS do te shohim klientin e ri qe eshte regjistruar, me c’rast rezultati do te jete si meposhte:

Perditesimi i shenimeve

Ne vazhdim le te supozojme qe deshirojme te perditesojme klientin me ID=5 dhe ta permiresojme mbiemrin e klientit ne Kastrati. Sintaksa e duhur per realizimin e ketij veprimi, do te jete si meposhte:

Pasi ta ekzekutojme sintaksen e mesiperme, do te duhej qe te perditesohet mbiemri i klientit ne fjale, me c’rast rezultati do te jete si meposhte:

Fshirja e shenimeve

Le te supozojme qe deshirojme te fshijme shenime nga tabela Klientet, psh dy klienta te cilet kane ID-ne 3, dhe 6. Sintaksa e duhur per realizimin e ketij veprimi, do te jete si meposhte:

Pasi ta ekzekutojme sintaksen e mesiperme, do te duhej qe te fshihen dy klientat me ID-te e cekura, me c’rast rezultati do te jete si meposhte:


Shenim:

Pervec paketes pyodbc, ekziston edhe paketa tjeter me emrin pymssql, e cila pothuasje ofron te njejtat vecori dhe benefite me paketen e pershkruar mesiper, mirepo perzgjedhja ime ishte vetem si demonstrim se si mund realizohet lidhja dhe komunikimi i Python me SQL Server!

Krijimi i nje kuizi duke perdore gjuhen programuese Python

Nevoja per krijim te kuizeve ose testeve eshte mjaft e madhe, qofte per qellime te hulumtimeve te ndryshme, qofte per vleresimin e diturise per ndonje teme te caktuar, e sidomos krijmi dhe perdorimi i kuizeve eshte i dobishem kur deshirojme qe te “matim” njohurite e nje studenti/punetori per te na konfirmuar dhe treguar qe ai/ajo ka njohurite e duhura per nje teme ose fushe te caktuar!
Menyra e implementimit te krijimit te nje kuizi le te jete duke perdore gjuhen programuese Python!

Pershkrimi i kuizit

Le te supozojme qe deshirojme te krijojme nje kuiz i cili ka te beje me vleresimin e nje studenti per disa tema te ndryshme. Le te perpilojme kuizin qe permbane gjithesej 5 pyetje (normalisht numri i pyetjeve mund te jete sado qe nevojitet).
Kuizi do te krijohet ne at menyre qe cdo pergjigje e sakte do te vleresohet me 1 pike, kurse cdo pergjigje jo e sakte do te vleresohet me 0 pike. Gjithashtu plotesuesi i kuizit do te kete mundesi qe nese pergjigja e pare eshte e pasakte, atehere do te kete mundesi te pergjigjet per here te dyte. Perndryshe nese edhe pas heres se dyte pergjigjet jo sakte, atehere kalohet ne pyetjen e radhes, dhe keshtu me radhe.

Kodi i duhur i cili mund te shkruhet ne Python, eshte si meposhte:

def check_guess(guess, answer):
    global score
    still_guessing = True
    attempt = 0
    while still_guessing and attempt < 2:
        if guess.lower() == answer.lower():
            print('Pergjigja eshte e sakte!')
            print('-------------------------------------')
            score = score + 1  # kjo mund te shenohet edhe ndryshe si: score += 1
            still_guessing = False
        else:
            if attempt < 1:
                guess = input(
                    'Pergjigja eshte jo e sakte! Ju lutem provoni perseri... ')
            attempt = attempt + 1
    if attempt == 2:
        print('Keni dhene pergjigje te gabuar! Pergjigja e sakte eshte: ' + answer)
        print('-------------------------------------')


score = 0
print('Kuiz i pergjithshem!')
question1 = input('1) Sa eshte rezultati i 6+4*2?\n A) 12\n B) 14\n C) 16\n D) 8\n Shenoni: A, B, C, D? ')
check_guess(question1, 'B')

question2 = input('2) Cili eshte shteti me me se shumti banore ne bote? ')
check_guess(question2, 'Kina')

question3 = input('3) Cili eshte kryeqyteti i Gjermanise?\n 1) Hamburg\n 2) Dortmund\n 3) Berlin\n 4) Bon\n Shenoni: 1, 2, 3, 4? ')
check_guess(question3, '3')

question4 = input('4) Karrotat jane perime?\n Po\n Jo\n Asnjera\n Shenoni: Po, Jo, Asnjera? ')
check_guess(question4, 'Po')

question5 = input('5) Cili numer duhet te vije pas ketij vargu 1, 3, 6, 10, ...? ')
check_guess(question5, '15')

print('Rezultati juaj final eshte: ' + str(score), 'pike')
print('Piket maksimale jane 5!\n',
      'Urime, keni arritur', score/5*100, '% te kalueshmerise!')

Sqarimi i kodit

  • Ne rreshtin 1 te kodit eshte krijuar nje funksion me emrin check_guess, i cili pranon dy parametra: pyetjen dhe pergjigjen.
  • Pjesa e kodit ne rreshtin 2 paraqet variablen e rezultatit (score) e cila eshte variabel globale dhe na siguron qe cdo ndryshim qe behet ne kete variabel mund te shihet ne te gjithe programin.
  • Variabla ne rreshtin 3 ruan nje nga dy vlerat e mundshme: True ose False. Pra, ne menyre qe te dijme nese plotesuesi i kuiziti ka marr pergjigje te sakte, duhet te krijojme nje variabel te quajtur psh me emrin still_guessing. Me pas e vendosim variablen si True per te treguar se pergjigja e sakte nuk eshte gjetur. Kurse nese vendoset variabla si False, atehere plotesuesi i kuizit merr pergjigje te sakte.
  • Pjesa e kodit ne rreshtin 5, perkatesisht while loop ekzekuton 2 here kontrollimin e kodit (kushtin) ose derisa plotesuesi i pyetjes merr pergjigjen e sakte.
  • Pjesa e kodit ne rreshtin 6 mundeson qe pa marre parasysh se a shenohet pergjigja me shkronja te medha, me te vogla ose kombinim i tyre, rezultati do te pranohet si i njejte (me shkronja te vogla). Psh nese njera nga pergjigjet eshte Python, atehere edhe nese pergjigjemi si: python, PYTHON, … rezultati eshte i njejte. Pra permes funksionit lower() mundesohet qe te gjitha shkronjat te konvertohen/ndryshohen ne shkronja te vogla (lower-case characters) para se ato te kontrollohen apo validohen.
  • Pjesa e kodit ne rreshtin 16 na tregon se cila eshte pergjigja e sakte pas 2 tentimeve me pergjigje te gabuara.
  • Pjesa e kodit ne rreshtin 21, perkateisht score = 0 paraqet variablen fillestare per te ruajtur vleren fillestare te rezultatit, e cila me pas rritet per 1 pike pas cdo rezultati te sakte.
  • Variablat ne rreshtin 23, 26, 29, 32, 35 ruajne vlera perkatese varesisht se cka shenon plotesuesi i kuizit ne pyetjen perkatese.
  • Pjesa e kodit ne rreshtin 24, 27, 30, 33, 36 paraqet kontrollimin dhe validimin e pergjigjes se sakt te cdo pyetje perkatese, permes se ciles thirret funksioni check_guess(). Pra, permes ketij funksioni pranohet pyetja e dhene, dhe kontrollohet se a eshte e sakte pergjigja perkatese.
  • Pjesa e kodit ne rreshtin 38, perkatesisht pjesa str(score) krijon nje mesazh qe tregon numrin e pikeve te arditura dhe i paraqet ato ne ekran.

Paraqitja e pyetjeve dhe rezultateve te pergjigjeve perkatese

Kuiz i pergjithshem!
1) Sa eshte rezultati i 6+4*2?
 A) 12
 B) 14
 C) 16
 D) 8
 Shenoni: A, B, C, D? d
Pergjigja eshte jo e sakte! Ju lutem provoni perseri... b
Pergjigja eshte e sakte!
-------------------------------------
2) Cili eshte shteti me me se shumti banore ne bote? kina
Pergjigja eshte e sakte!
-------------------------------------
3) Cili eshte kryeqyteti i Gjermanise?
 1) Hamburg
 2) Dortmund
 3) Berlin
 4) Bon
 Shenoni: 1, 2, 3, 4? 2
Pergjigja eshte jo e sakte! Ju lutem provoni perseri... 4
Keni dhene pergjigje te gabuar! Pergjigja e sakte eshte: 3
-------------------------------------
4) Karrotat jane perime?
 Po
 Jo
 Asnjera
 Shenoni: Po, Jo, Asnjera? po
Pergjigja eshte e sakte!
-------------------------------------
5) Cili numer duhet te vije pas ketij vargu 1, 3, 6, 10, ...? 14
Pergjigja eshte jo e sakte! Ju lutem provoni perseri... 15
Pergjigja eshte e sakte!
-------------------------------------
Rezultati juaj final eshte: 4 pike
Piket maksimale jane 5!
 Urime, keni arritur 80.0 % te kalueshmerise!

Shenim:
Vlene te permendet qe ekzistojne edhe metoda tjera permes te cilave mund te krijohen kuize te ndryshme duke perdore gjuhen programuese Python. Psh metoda tjeter (e cila mund te jete me e preferueshme) e krijimit te nje kuizi eshte perdorimi i klasave, lists, arrays, for loops! Megjithate edhe metoda te cilen e kam zgjedhe, shpresoj qe eshte e duhura dhe sado pak e pershkruan logjiken dhe menyren e krijimit te nje kuizi duke perdore gjuhen programuese Python.


Normalisht kjo pjese e kodit te cilen e kam shenuar me larte, mund te vendoset dhe ekzekutohet ne Python IDE, ose cfaredo “code editori” ne te cilen eshte i instaluar Python extension, sic jane psh: Visual Studio Code (VSC), Sublime Text, etj.

Kalkulimi i pagës duke përdorë gjuhën programuese Python

Kalkulimi i pages eshte nje nga informatat shume te rendesishme qe duhet ta dijne te gjithe punetoret (qofte punedhenesi ose punemarresi), sidomos punetoret e rinje te cilet vetem se kane filluar punen dhe presin te marrin pagen e pare :), por gjithashtu edhe punetoret ekzistues te cileve eventualisht i peson rritje paga!

Edhepse ka mjaft kompani ose programera qe kane zhvilluar aplikacione te ndryshme qe ekzistojne ne treg (duke perdore Excel, C#, PHP, Java, etj) te cilat mundesojne kalkulimin e pages me te gjitha kontributet dhe shkallet e tatimeve perkatese, mirepo pak nga ato kompani/programera tregojne menyren ose kodin burimor se si e kane implementuar nje gje te tille!

Megjithate une do te mundohem qe te paraqes sintaksen perkatese duke perdore komandat e ndryshme qe i ofron gjuha programuese Python! Normalisht kjo pjese e kodit mund te vendoset dhe ekzekutohet ne Python IDE, ose cfaredo “code editori” ne te cilen eshte i instaluar Python extension, sic jane psh: Visual Studio Code (VSC), Sublime Text, etj.

while True:
    try:
        paga_bruto = float(input("Shenoni pagen bruto:"))
        if paga_bruto < 0:
            raise ValueError("Vlera e dhene nuk eshte valide")
    except ValueError:
        print('Vlera e dhene', paga_bruto, 'nuk eshte valide!')
        continue
    kontributi_punetorit = 0.05
    kontributi_punedhenesit = 0.05
    paga_tatueshme = paga_bruto-paga_bruto*kontributi_punedhenesit
    # Perqindjet e tatimeve sipas vleres se pages (0-80 = 0%, 80-250 = 4%, 250-450 = 8%, >450 = 10%)
    t1 = 0.0
    t2 = 0.04
    t3 = 0.08
    t4 = 0.1
    tatimi1 = 0
    tatimi2 = 80
    tatimi3 = 250
    tatimi4 = 450
    if paga_bruto > 0 and paga_bruto <= 80:
        t = (tatimi2-tatimi1)*t1
        paga_neto = paga_tatueshme-paga_tatueshme*t1-t
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((paga_tatueshme-tatimi1)*t1, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    elif paga_bruto > 80 and paga_bruto <= 250:
        t = (paga_tatueshme-tatimi2)*t2+(tatimi2-tatimi1)*t1
        paga_neto = paga_tatueshme-t
        paga_neto = round(paga_neto, 2)
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((tatimi2-tatimi1)*t1, 2), "euro")
        print("Paga prej 80-250€:", round((paga_tatueshme-tatimi2)*t2, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    elif paga_bruto > 250 and paga_bruto <= 450:
        t = (paga_tatueshme-tatimi3)*t3+(tatimi3-tatimi2)*t2
        paga_neto = paga_tatueshme-t
        paga_neto = round(paga_neto, 2)
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((tatimi2-tatimi1)*t1, 2), "euro")
        print("Paga prej 80-250€:", round((tatimi3-tatimi2)*t2, 2), "euro")
        print("Paga prej 250-450€:", round((paga_tatueshme-tatimi3)*t3, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    elif paga_bruto > 450:
        t = (paga_tatueshme-tatimi4)*t4 + \
            (tatimi4-tatimi3)*t3+(tatimi3-tatimi2)*t2
        paga_neto = paga_tatueshme-t
        paga_neto = round(paga_neto, 2)
        t = round(t, 2)
        print("----------------------------------------")
        print("Paga bruto:", paga_bruto, "euro")
        print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
        print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
        print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
        print("Paga prej 0-80€:", round((tatimi2-tatimi1)*t1, 2), "euro")
        print("Paga prej 80-250€:", round((tatimi3-tatimi2)*t2, 2), "euro")
        print("Paga prej 250-450€:", round((tatimi4-tatimi3)*t3, 2), "euro")
        print("Paga mbi 450€:", round((paga_tatueshme-tatimi4)*t4, 2), "euro")
        print("Vlera totale e tatimit:", t, "euro")
        print("Paga neto:", paga_neto, "euro")
        print("----------------------------------------")
    break


Kodi i mesiperm ka te beje me kalkulimin e pages primare, mirepo nese ka persona qe punojne nga 2 e me shume “puna” :), atehere kemi te bejme me pagen primare plus pagen sekondare, me c’rast kalkulimi i pages sekondare ne Python mund te behet duke perdore kodin ose skripten si ne vijim:

while True:
    try:
        paga_bruto = float(input("Shenoni pagen bruto:"))
        if paga_bruto < 0:
            raise ValueError("Vlera e dhene nuk eshte valide")
    except ValueError:
        print('Vlera e dhene', paga_bruto, 'nuk eshte valide!')
        continue
    kontributi_punetorit = 0.05
    kontributi_punedhenesit = 0.05
    paga_tatueshme = paga_bruto-paga_bruto*kontributi_punedhenesit
    # Perqindja e tatimit per pagen sekondare eshte 10%
    t = 0.1
    tatimi = paga_tatueshme*t
    paga_neto = paga_tatueshme-paga_tatueshme*t
    tatimi = round(tatimi, 2)
    paga_neto = round(paga_neto, 2)
    print("----------------------------------------")
    print("Paga bruto:", paga_bruto, "euro")
    print("Kontributi i punetorit (5%):", round(paga_bruto*kontributi_punetorit, 2), "euro")
    print("Kontributi i punedhenesit (5%):", round(paga_bruto*kontributi_punedhenesit, 2), "euro")
    print("Paga qe tatohet:", round(paga_tatueshme, 2), "euro")
    print("Vlera totale e tatimit:", tatimi, "euro")
    print("Paga neto:", paga_neto, "euro")
    print("----------------------------------------")