10 Veebilehe sidumine PostgreSQL andmebaasiga

Eelmises peatükis lõime me veebilehe üldise struktuuri. Selles peatükis vaatame, kuidas ühendada meie veebirakendus PostgreSQL andmebaasiga.

Selleks lisa esmalt faili algusesse rida

from flask_sqlalchemy import SQLAlchemy

Nüüd tuleb täpsustada, kus asub andmebaas, millega me soovime ühendust luua. PostgreSQL korral on andmebaasi aaadressi üldkuju järgnev:

postgres+psycopg2://SinuKasutaja:SinuParool@localhost:5432/SinuAndmebaasiNimi

Siin tuleb asendada roheliseks tehtud kohad õigete väärtustega. Selleks, et leida enda andmebaasi kasutaja, parool ja nimi, tehke järgnevat:

  1. Avage DBeaver
  2. Minge DBeaveri menüüs Window -> Database Navigator
  3. Nüüd on vasakul näha Database Navigator menüüd
  4. Database Navigator menüüs peaks olema nähtaval üks andmebaas, antud näites on selle nimeks postgres. Parem klikka sellel andmebaasil ja avanenud menüüs vali Edit Connection.
  5. Avanevas aknas ongi näha sinu andmebaasi nimi (Database) ning kasutaja (Username). Samuti on seal olemas peidetud kujul sinu parool. Parooliks peaks olema ‘parool’, eeldusel, et te andmebaasi luues kasutasite juhendis olevat parooli. Kui te otsustasite parooli muuta, tuleb see teil endal meelde tuletada. Ehk siis selle näite korral oleks andmebaasi asukohaks
    postgres+psycopg2://postgres:parool@localhost:5432/postgres.

Nüüd kui andmebaasi asukoht on leitud, lisa faili app.py rea app = Flask(__name__) järele:

app.config['SQLALCHEMY_DATABASE_URI'] = 'ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA' # andmebaasi asukoht
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # muudatuste jälgimise süsteemi sätted
db = SQLAlchemy(app) # andmebaasiga ühendamine

Pane tähele, et andmebaasi asukoht tuleb asendada ennist leitud PostgreSQL andmebaasi asukohaga. Lisa see väärtuse ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA asemele ülakriipsude vahele.

Järgmisena tuleb määrata ära meie loodava tabeli struktuur. Et me soovime kommentaari korral salvestada selle sisu ning autorit, loomegi tabeli Kommentaar tunnustega sisu ja autor. Kuna igale tabelile on vaja ka primaarvõtit, lisame tabelile Kommentaar ka tunnuse id, mis saabki primaarvõtmeks. Kuna me ei taha, et kommentaari sisu ning autor oleksid tühjad, lisame nõude, et nende tunnuste väärtused ei tohi tühjad olla (nullable = False).

Selleks, et tabelit Kommentaar Flask-SQLAlchemy toel luua, peame me koodi lisama järgneva klassi:

class Kommentaar(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sisu = db.Column(db.String(1000), nullable=False)
    autor = db.Column(db.String(100), nullable=False)

Nagu näha, siis andmetüübid on siin meie õpitust erinevad, kuid sisuliselt käitub siin String(n) sarnaselt nagu varchar(n). Etteruttavalt võib öelda, et kui pärast tabeli Kommentaar loomist seda DBeaveris uurida, on näha, et andmetüübiks on salvestatud siiski varchar, mitte String. Pane ka tähele, et sisu korral piirasime me tähemärkide arvu 1000 peale. Võib-olla on see mõne veebilehe kommentaari jaoks liiga väike arv tähemärke, kuid ütleme, et selle veebilehe jaoks on see piisav.

Selleks, et hiljem vajadusel kommentaari kohta infot väljastada, tuleb lisada järgnevad read klassi Kommentaar:

def __repr__(self):
    return 'Kommentaar ' + str(self.id)

Seega klass Kommentaar peab välja nägema selline:

class Kommentaar(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sisu = db.Column(db.String(1000), nullable=False)
    autor = db.Column(db.String(100), nullable=False)
    
    def __repr__(self):
        return 'Kommentaar ' + str(self.id)

Nüüd seome eelmises peatükis loodud veebivormi andmebaasiga. Selleks muuda meetod Avaleht selliseks:

@app.route('/', methods=['POST', 'GET'])
def avaleht():
    if request.method == 'POST':
        sisestatud_sisu = request.form['sisu']
        sisestatud_autor = request.form['autor']
        uus_kommentaar = Kommentaar(sisu=sisestatud_sisu, autor=sisestatud_autor)
        db.session.add(uus_kommentaar)
        db.session.commit()
        return redirect('/')
    else:
        kommentaarid_andmebaasist = Kommentaar.query.all()
        return render_template('avaleht.html', kommentaarid=kommentaarid_andmebaasist)

Kui tegu on “POST” meetodiga, soovime me kasutaja sisestatud andmed andmebaasi salvestada. Selleks loome me kasutaja sisestatud andmete põhjal uue kommentaari ning lisame selle andmebaasi. Vastasel juhul soovime me kuvada kõikide andmebaasis olevate kommentaaride sisu ja autorid veebilehele. Selleks pärime me andmebaasist kõik kommentaarid ning renderdame need avalehele.

Kokku saame nüüd app.py sisuks:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask, render_template, request, redirect

app.config['SQLALCHEMY_DATABASE_URI'] = 'ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA' # andmebaasi asukoht
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # muudatuste jälgimise süsteemi sätted
db = SQLAlchemy(app) # andmebaasiga ühendamine

class Kommentaar(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sisu = db.Column(db.String(1000), nullable=False)
    autor = db.Column(db.String(100), nullable=False)
    
    def __repr__(self):
        return 'Kommentaar ' + str(self.id)
    
@app.route('/', methods=['POST', 'GET'])
def avaleht():
    if request.method == 'POST':
        sisestatud_sisu = request.form['sisu']
        sisestatud_autor = request.form['autor']
        uus_kommentaar = Kommentaar(sisu=sisestatud_sisu, autor=sisestatud_autor)
        db.session.add(uus_kommentaar)
        db.session.commit()
        return redirect('/')
    else:
        kommentaarid_andmebaasist = Kommentaar.query.all()
        return render_template('avaleht.html', kommentaarid=kommentaarid_andmebaasist)

Selleks, et nüüd reaalselt meie rakendus PostgreSQL andmebaasiga ühendada ning meie andmebaasi tabel nimega Kommentaar luua, kirjuta Thonny käsureale kõigepealt from app import db ja seejärel db.create_all().

>>>  from app import db
>>>  db.create_all()

Kui veateateid ei ilmunud, võite vaadata DBeaveris andmebaasi, mille all me varasemalt toimetanud oleme (public). Seal all peaks nüüd olema nähtaval tabel Kommentaar, millel on app.py klassis Kommentaar täpsustatud tunnused – id, sisu ja autor. Kui tabelit pole näha, siis värskendage andmebaasi vaadet (parem klikka andmebaasil public ja vali avanenud valikutest Refresh).

NB! Kui teil ilmus PostgreSQL’iga ühendades viga, siis kontrollige oma andmebaasi asukohta ning veenduge, et see oleks õigel kujul ning kõik väljatoodud kohad said asednatud õigete väärtustega. Kui see ei aidanud, kontrollige et, DBeaveris oleks kindlasti olemas skeema nimega public, millega me varasemates peatükkides tööd teinud oleme ning mida me skeema asemel andmebaasiks nimetasime. Kui seda seal pole, parem klikka vasakul menüüs valiku Schemas peal ning vali avanenud valikutest Create New Schema. Märgi uue skeema nimeks public.

Nüüd olemegi me oma veebirakenduse valmis saanud. Käivitage Thonny’s app.py ja vaadake meie loodud veebilehte aadressilt http://127.0.0.1:5000/.

Kui te sisestate mõne kommentaari ning selle autori, siis vaadake ka DBeaverisse tabeli Kommentaar vahelehe data all peaks olema nähtaval kõik teie lisatud kommentaarid.

 

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Lisamoodulid on loodud Aveli Klaos, Siim Tanel Laisaar, Piret Luik, Tauno Palts, ja Eero Ääremaa poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut