# -*- coding: UTF-8 -*- import sqlite3 import os import sys # tietokanta on samassa kansiossa mutta yleensä sqlite3.connect kaipaa absoluuttisen polun # luodaan connection-objekti # https://docs.python.org/2/library/sqlite3.html#connection-objects con = sqlite3.connect( os.path.abspath('mallidb')) # luodaan kursori # https://docs.python.org/2/library/sqlite3.html#cursor-objects cur = con.cursor() try: # kenttien järjestystä ei määrätä jos käytetään SELECT * cur.execute(""" SELECT * FROM resepti """) except: print("nyt tuli virhe: %s" % sys.exc_info()[0]) # kursori palauttaa python-listan, jonka sisällä on tupleja. Yksi tuple vastaa aina yhtä tietuetta reseptit = cur.fetchall() # tulostetaan kaikki. Suora dumppaus stringiksi print "Reseptit objektidumppina" print( str(reseptit)+"\n") # Listan ja tuplejen läpikäynti silmukassa print "Reseptit:" for rivi in reseptit: # ajatellaan, että yksi tietue on rivi for sarake in rivi: # ajatellaan, että yksi rivi sisältää sarakkeita try: print str(sarake.encode("UTF-8")) + "\t", # muistettava encode jos printataan. Kaatuu jos kyseessä onkin int tms. except: # tullaan tänne jos edellä ei ollutkaan string print str(sarake) + "\t", # jos print-lauseen lopussa on , niin rivinvaihtoa ei tulosteta print # rivin lopuksi rivinvaihto # kenttien järjestys on nyt tiedossa! muuten sama kysely kuin edellä sql = """ SELECT nimi, henkilomaara, kuvaus, ruokalajiid FROM resepti """ try: # Jos sql-lauseessa on virhe niin tuloksena on operational error cur.execute(sql) except: print("nyt tuli virhe: %s" % sys.exc_info()[0]) # suoritetaan seuraava kyse reseptit = cur.fetchall() # luodaan helpommin käsiteltävä tietorakenne eli lista, jonka sisällä on dictejä # http://www.tutorialspoint.com/python/python_dictionary.htm # dict on erittäin kätevä tietorakenne! rese = [] for rivi in reseptit: rese.append( {"nimi":rivi[0], "henkilomaara": rivi[1], "kuvaus": rivi[2], "ruokalajiid": rivi[3] } ) # seuraava ei toimi koska ei ole asetettu con.row_factory = sqlite3.Row # rese.append( {"nimi":rivi['nimi'], "henkilomaara": rivi['henkilomaara'], "kuvaus": rivi['kuvaus'], "ruokalajiid": rivi['ruokalajiid'] } ) # vertaa tätä tulostetta aiempaan dumppaukseen. Rakenne on nyt erilainen, koska yhtä tietuetta vastaakin # dict eikä tuple print "Reseptit dicteinä:" print str(rese) rese = [] # sama kuin edellä mutta asetetaan nyt: con.row_factory = sqlite3.Row cur = con.cursor() #kursori pitää luoda uudelleen jotta edellä tehty asetus toimii try: cur.execute(sql) except: print("nyt tuli virhe: %s" % sys.exc_info()[0]) # ei haeta turhaan koko listaa erilliseen muuttajaan vaan käydään suoraan kursori läpi rivi kerrallaan: for rivi in cur: #for rivi in cur.fetchall(): rese.append( {"nimi":rivi['nimi'], "henkilomaara": rivi['henkilomaara'], "kuvaus": rivi['kuvaus'], "ruokalajiid": rivi['ruokalajiid'] } ) print "Reseptit dicteinä v2:" print str(rese) print "--------------------------------------------------------------------------" # palautetaan ennalleen con.row_factory = None cur = con.cursor() #kursori pitää luoda uudelleen jotta edellä tehty asetus toimii cur.execute(""" SELECT * FROM resepti WHERE nimi = 'Ananas Con Carne' """) # seuraava rivi ei toimi kunnolla jos row_factory = sqlite3.row on päällä print( str(cur.fetchall()).encode("UTF-8")+"\n") #annettavien arvojen on oltava tuple siksi ylim , resepti1 = u"Ananas Con Carne" # merkkijonojen eteen on laitettava u-merkki jotta python ymmärtää niiden olevan unicodea eikä asciita cur.execute(""" SELECT * FROM resepti WHERE nimi = ? """, (resepti1,)) print( str(cur.fetchall()).encode("UTF-8")+"\n") resepti2 = "Tiramisu" #annettavien arvojen on oltava tuple reseptit = (resepti1, resepti2) #Kelpuutetaan tiramisu tai ananas con carne cur.execute(""" SELECT * FROM resepti WHERE nimi = ? OR nimi = ? """, reseptit) print( str(cur.fetchall()).encode("UTF-8")+"\n") reseptit = {"rese1":resepti1, "rese2":resepti2} cur.execute(""" SELECT * FROM resepti WHERE nimi = :rese1 OR nimi = :rese2 """, reseptit) # Taas yksi erilainen versio käydä kursori silmukassa läpi: for (nimi, kuvaus, hlomaara, id, tyyppi) in cur: print('nimi:\t%s\n' % (nimi) ) print('kuvaus:\t%s\n' % (kuvaus) ) print('hlomaara:\t%s\n' % (hlomaara) ) print('id:\t%s\n' % (id) ) print('tyyppi:\t%s\n\n' % (tyyppi) ) print( "------\n" ) for rivi in cur: print('nimi:\t%s\n' % (rivi[0]) ) print('kuvaus:\t%s\n' % (rivi[1]) ) print('hlomaara:\t%s\n' % (rivi[2]) ) print('id:\t%s\n' % (rivi[3]) ) print('tyyppi:\t%s\n\n' % (rivi[4]) ) print( "------\n" ) con.row_factory = sqlite3.Row cur = con.cursor() cur.execute(""" SELECT * FROM resepti """) for rivi in cur: for i in rivi.keys(): try: print('%s:\t%s\n' % (i, rivi[i].encode("UTF-8")) ) except: print('%s:\t%s\n' % (i, rivi[i]) ) print("-----------------\n"); cur.execute(""" SELECT * FROM resepti """) for rivi in cur: print('Nimi:\t%s\n' % (rivi['Nimi'].encode("UTF-8")) ) print('Kuvaus:\t%s\n' % (rivi['Kuvaus'].encode("UTF-8")) ) print('Henkilomaara:\t%s\n' % (rivi['Henkilomaara']) ) print('ReseptiID:\t%s\n' % (rivi['ReseptiID']) ) print('RuokalajiID:\t%s\n' % (rivi['RuokalajiID']) ) #transaktiot # print("Transaktiot\n") try: cur.execute(""" INSERT INTO Resepti (Nimi, Kuvaus, Henkilomaara, RuokalajiID) VALUES (:nimi, :kuvaus, :henkilomaara, :ruokalajiID ) """, {"nimi":"Talkkunahyve", "kuvaus":"perinteinen jälkkäri", "henkilomaara":4,"ruokalajiID":7}) except: print("nyt tuli virhe: %s" % sys.exc_info()[0] + "\n") print("Lisääminen epäonnistui\n") # palauttaa viimeisimmän lisäyksen id:n reseptiID = cur.lastrowid # reseptiID = "9" print( str(reseptiID) + "\n" ) try: cur.execute(""" UPDATE Resepti SET Nimi = 'Puolukkahyve' WHERE ReseptiID = ? """, (reseptiID,)) except: print("nyt tuli virhe: %s" % sys.exc_info()[0] + "\n") print("Päivittäminen epäonnistui\n") try: cur.execute(""" DELETE From Resepti WHERE ReseptiID = :id """, {"id":reseptiID} ) except: print("nyt tuli virhe: %s" % sys.exc_info()[0] + "\n") print("Poistaminen epäonnistui\n") #ilman tätä muutokset eivät jää voimaan! con.commit() print("Transaktio loppuu\n") try: cur.execute(""" SELECT last_insert_rowid() """) except: print( "epäonnistui" ) avain = cur.fetchone() print( str(avain[0]) + "\n" ) cur.execute(""" SELECT Nimi FROM resepti """) for rivi in cur: print('%s\n' % (rivi["Nimi"]) ) #yhteys pitää lopuksi sulkea #poikkeuksena tilanteet joissa samaa yhteyttä jaetaan con.close()