#!/wwwhome/home/tjlahton/public_html/cgi-bin/tiea2080/venv/bin/python
# -*- coding: utf-8 -*-
from flask import Flask, session, redirect, url_for, escape, request, Response, render_template
import sys
import sqlite3
import os
import werkzeug.exceptions
app = Flask(__name__)
app.debug = True
# set the secret key. keep this really secret:
app.secret_key = '"\xf9$T\x88\xefT8[\xf1\xc4Y-r@\t\xec!5d\xf9\xcc\xa2\xaa'
#Omat try..exceptit on tästä jätetty pois. Tuotantosovelluksessa niitä pitäisi olla
@app.route('/reseptit')
def reseptit():
# oletetaan että sovellus on kansiossa /~omatunnus/cgi-bin/tiea2080/ohjaus4/
# ja tietokanta on kansiossa /~omatunnus/hidden/
# os.path.abspath muuntaa suhteellisen polun absoluuttiseksi, joka taasen kelpaa sqlitelle
con = sqlite3.connect(os.path.abspath('../../../hidden/resepti'))
con.execute("PRAGMA foreign_keys = ON")
# voidaan käsitellä palautettuja tietueita niiden kenttien nimillä
con.row_factory = sqlite3.Row
sql = """
SELECT *
FROM resepti
"""
cur = con.cursor()
cur.execute(sql)
# valmistellaan kysely ja sijoitetaan dynaamisen arvon tilalle :lkm-muuttuja
sql = '''SELECT Nimi, Kuvaus, Henkilomaara, ReseptiID, RuokaLajiID
FROM Resepti
WHERE henkilomaara = :lukumaara
'''
lkm = 4
cur.execute( sql, {"lukumaara":lkm})
# Lisääminen. Tämä epäonnistuu, koska on jo lisätty samalla id:llä
sql = '''INSERT INTO resepti (Nimi, Kuvaus, Henkilomaara, RuokalajiID, ReseptiID)
VALUES (:nimi, :kuvaus, :henkilomaara, :ruokalaji, :reseptiid)
'''
lkm = 4
nimi = u'Makaronilaatikko'
kuvaus = u'Herkkuruoka'
henkilomaara = 3
# cur.execute( sql, {"nimi":nimi, "kuvaus":kuvaus, "henkilomaara": henkilomaara, "ruokalaji": 2, "reseptiid": 10})
# con.commit()
# Lisääminen. Tämä onnistuu, koska ei itse anneta reseptiid:tä ollenkaan vaan annetaan tietokannan
# hoitaa se. Toimii vain koska tietokannassa kyseinenn kenttä on tyyppiä autoincrement:
# ReseptiID INTEGER PRIMARY KEY AUTOINCREMENT,
sql = '''INSERT INTO resepti (Nimi, Kuvaus, Henkilomaara, RuokalajiID)
VALUES (:nimi, :kuvaus, :henkilomaara, :ruokalaji)
'''
lkm = 4
nimi = u'Makaronilaatikko'
kuvaus = u'Herkkuruoka'
henkilomaara = 3
cur.execute( sql, {"nimi":nimi, "kuvaus":kuvaus, "henkilomaara": henkilomaara, "ruokalaji": 2})
# Poista. resepti
sql = '''DELETE FROM resepti WHERE reseptiID = :id
'''
cur.execute( sql, {"id":2})
# Poista. ruokalaji. Tämä kaatuu, koska ruokalaji on käytössä ja viite-eheys estää poistamisen
sql = '''DELETE FROM ruokalaji WHERE ruokalajiID = :id
'''
# cur.execute( sql, {"id":2})
# Poista useita reseptejä.
sql = '''DELETE FROM resepti WHERE reseptiid > 10
'''
cur.execute(sql)
# Tee päivitys
sql = '''UPDATE resepti SET henkilomaara = :maara WHERE reseptiID = :reseptiID '''
cur.execute(sql, {"maara":7, "reseptiID": 3})
sql = """
SELECT nimi as Nimi, kuvaus as Kuvaus, henkilomaara as Henkilomaara
FROM resepti
"""
cur.execute(sql) # suoritetaan kysely
reseptit = cur.fetchall() #haetaan kaikki kyselyn tulokset
sql = """
SELECT nimi as Nimi, kuvaus as Kuvaus
FROM Ruokalaji
"""
cur.execute(sql) # suoritetaan kysely
ruokalajit = cur.fetchall() #haetaan kaikki kyselyn tulokset
sql = """
SELECT ruokalaji.nimi AS ruokalaji, resepti.nimi AS resepti
FROM resepti, ruokalaji
WHERE ruokalaji.ruokalajiID = resepti.ruokalajiID
ORDER BY ruokalaji.nimi, resepti.nimi """
cur.execute(sql) # suoritetaan kysely
ruokareseptit = cur.fetchall() #haetaan kaikki kyselyn tulokset
sql = """
SELECT ruokalaji.nimi AS ruokalaji, resepti.nimi AS resepti
FROM ruokalaji LEFT OUTER JOIN resepti
ON ruokalaji.ruokalajiID = resepti.ruokalajiID
ORDER BY ruokalaji.nimi, resepti.nimi"""
cur.execute(sql) # suoritetaan kysely
ruokareseptit_all = cur.fetchall() #haetaan kaikki kyselyn tulokset
con.commit() # kommitoidaan kaikki edellä tehdyt muutokset. Jos tätä ei tehdä niin mikään edellä tehdyistä ei jää voimaan
# Lisääminen transaktion avulla.
sql = '''INSERT INTO ruokalaji (Nimi, Kuvaus, ruokalajiID)
VALUES (:nimi, :kuvaus, :ruokalajiid )
'''
nimi = u'Salaiset ruuat'
kuvaus = u'Ihan oma herkut'
virheet = 0
try:
cur.execute( sql, {"nimi":nimi, "kuvaus":kuvaus, "ruokalajiid": 33})
except:
virheet += 1
sql = '''INSERT INTO resepti (Nimi, Kuvaus, henkilomaara, ruokalajiid, reseptiID)
VALUES (:nimi, :kuvaus, :henkilomaara, :ruokalaji, :reseptiid )
'''
nimi = u'Salaiset ruuat'
kuvaus = u'Ihan oma herkut'
try:
# tämä epäonnistuu, koska reseptiid 1 on jo käytössä
cur.execute( sql, {"nimi":nimi, "kuvaus":kuvaus, "henkilomaara":2, "ruokalaji": 33, "reseptiid": 1})
except:
virheet += 1
if virheet:
con.rollback() #jos virheitä niin perutaan muutokset
else:
con.commit() # kommitoidaan kaikki edellä tehdyt muutokset. Jos tätä ei tehdä niin mikään edellä tehdyistä ei jää voimaan
# Sama kuin edellä, mutta hyödynnetään autoincrement-kenttiä. Nyt lisääminen onnistuu
sql = '''INSERT INTO ruokalaji (Nimi, Kuvaus)
VALUES (:nimi, :kuvaus )
'''
# ruokalajien nimien on oltava uniikkeja joten tätä samaa ei voi lisätä useampaan kertaan
nimi = u'Salaiset ruuat'
kuvaus = u'Ihan oma herkut'
virheet = 0
try:
cur.execute( sql, {"nimi":nimi, "kuvaus":kuvaus})
except:
virheet += 1
sql = '''INSERT INTO resepti (Nimi, Kuvaus, henkilomaara, ruokalajiid)
VALUES (:nimi, :kuvaus, :henkilomaara, :ruokalaji)
'''
nimi = u'Salaiset ruuat'
kuvaus = u'Ihan oma herkut'
ruokalaji = cur.lastrowid #haetaan edellisen kyselyn lastrowid
try:
cur.execute( sql, {"nimi":nimi, "kuvaus":kuvaus, "henkilomaara":2, "ruokalaji": ruokalaji})
except:
virheet += 1
if virheet:
con.rollback() #jos virheitä niin perutaan muutokset
else:
con.commit() # kommitoidaan kaikki edellä tehdyt muutokset. Jos tätä ei tehdä niin mikään edellä tehdyistä ei jää voimaan
con.close() # suljetaan yhteys tietokantaan
return render_template('reseptit.html', reseptit=reseptit, ruokalajit=ruokalajit, ruokareseptit=ruokareseptit, ruokareseptit_all=ruokareseptit_all)
if __name__ == '__main__':
app.debug = True
app.run(debug=True)