{"id":1222,"date":"2021-04-22T19:37:41","date_gmt":"2021-04-22T19:37:41","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/?post_type=chapter&#038;p=1222"},"modified":"2021-05-06T19:26:26","modified_gmt":"2021-05-06T19:26:26","slug":"veebilehe-sidumine-postgresql-andmebaasiga","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/chapter\/veebilehe-sidumine-postgresql-andmebaasiga\/","title":{"raw":"Veebilehe sidumine PostgreSQL andmebaasiga","rendered":"Veebilehe sidumine PostgreSQL andmebaasiga"},"content":{"raw":"<p style=\"text-align: justify\">Eelmises peat\u00fckis l\u00f5ime me veebilehe \u00fcldise struktuuri. Selles peat\u00fckis vaatame, kuidas \u00fchendada meie veebirakendus PostgreSQL andmebaasiga.<\/p>\r\n<p style=\"text-align: justify\">Selleks lisa esmalt faili algusesse rida<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from flask_sqlalchemy import SQLAlchemy<\/pre>\r\n<p style=\"text-align: justify\">N\u00fc\u00fcd tuleb t\u00e4psustada, kus asub andmebaas, millega me soovime \u00fchendust luua. PostgreSQL korral on andmebaasi aaadressi \u00fcldkuju j\u00e4rgnev:<\/p>\r\n<p style=\"text-align: justify\"><code>postgres+psycopg2:\/\/<span style=\"color: #008000\">SinuKasutaja<\/span>:<span style=\"color: #008000\">SinuParool<\/span>@localhost:5432\/<span style=\"color: #008000\">SinuAndmebaasiNimi<\/span><\/code><\/p>\r\n<p style=\"text-align: justify\">Siin tuleb asendada roheliseks tehtud kohad \u00f5igete v\u00e4\u00e4rtustega. Selleks, et leida enda andmebaasi kasutaja, parool ja nimi, tehke j\u00e4rgnevat:<\/p>\r\n\r\n<ol>\r\n \t<li style=\"text-align: justify\">Avage DBeaver<\/li>\r\n \t<li style=\"text-align: justify\">Minge DBeaveri men\u00fc\u00fcs <em>Window<\/em> -&gt; <em>Database Navigator<\/em><\/li>\r\n \t<li style=\"text-align: justify\">N\u00fc\u00fcd on vasakul n\u00e4ha <em>Database Navigator <\/em>men\u00fc\u00fcd\r\n<img class=\"alignnone wp-image-794\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-300x228.png\" alt=\"\" width=\"715\" height=\"544\" \/><\/li>\r\n \t<li style=\"text-align: justify\"><em>Database Navigator m<\/em>en\u00fc\u00fcs peaks olema n\u00e4htaval \u00fcks andmebaas, antud n\u00e4ites on selle nimeks <em>postgres<\/em>. Parem klikka sellel andmebaasil ja avanenud men\u00fc\u00fcs vali <em>Edit Connection.\r\n<\/em><img class=\"alignnone wp-image-795\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-300x229.png\" alt=\"\" width=\"715\" height=\"546\" \/><\/li>\r\n \t<li style=\"text-align: justify\">Avanevas aknas ongi n\u00e4ha sinu andmebaasi nimi (<em>Database) <\/em>ning kasutaja (<em>Username)<\/em>. Samuti on seal olemas peidetud kujul sinu parool. Parooliks peaks olema \u2018parool\u2019, eeldusel, et te andmebaasi luues kasutasite juhendis olevat parooli. Kui te otsustasite parooli muuta, tuleb see teil endal meelde tuletada. Ehk siis selle n\u00e4ite korral oleks andmebaasi asukohaks\r\n<code>postgres+psycopg2:\/\/<span style=\"color: #008000\">postgres<\/span>:<span style=\"color: #008000\">parool<\/span>@localhost:5432\/<span style=\"color: #008000\">postgres<\/span><\/code>.\r\n<img class=\"alignnone wp-image-796\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaasi_andmed-300x233.png\" alt=\"\" width=\"718\" height=\"558\" \/><\/li>\r\n<\/ol>\r\n<p style=\"text-align: justify\">N\u00fc\u00fcd kui andmebaasi asukoht on leitud, lisa faili <em>app.py<\/em> rea <code>app = Flask(__name__)<\/code> j\u00e4rele:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">app.config['SQLALCHEMY_DATABASE_URI'] = 'ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA' # andmebaasi asukoht\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # muudatuste j\u00e4lgimise s\u00fcsteemi s\u00e4tted\r\ndb = SQLAlchemy(app) # andmebaasiga \u00fchendamine<\/pre>\r\n<p style=\"text-align: justify\">Pane t\u00e4hele, et andmebaasi asukoht tuleb asendada ennist leitud PostgreSQL andmebaasi asukohaga. Lisa see v\u00e4\u00e4rtuse <code><span style=\"color: #008000\">ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA<\/span> <\/code>asemele \u00fclakriipsude vahele.<\/p>\r\n<p style=\"text-align: justify\">J\u00e4rgmisena tuleb m\u00e4\u00e4rata \u00e4ra meie loodava tabeli struktuur. Et me soovime kommentaari korral salvestada selle sisu ning autorit, loomegi tabeli <em>Kommentaar<\/em> tunnustega <em>sisu <\/em>ja <em>autor. <\/em>Kuna igale tabelile on vaja ka primaarv\u00f5tit, lisame tabelile <em>Kommentaar <\/em>ka tunnuse <em>id<\/em>, mis saabki primaarv\u00f5tmeks. Kuna me ei taha, et kommentaari sisu ning autor oleksid t\u00fchjad, lisame n\u00f5ude, et nende tunnuste v\u00e4\u00e4rtused ei tohi t\u00fchjad olla (nullable = False).<\/p>\r\n<p style=\"text-align: justify\">Selleks, et tabelit <em>Kommentaar<\/em> Flask-SQLAlchemy toel luua, peame me koodi lisama j\u00e4rgneva klassi:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">class Kommentaar(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    sisu = db.Column(db.String(1000), nullable=False)\r\n    autor = db.Column(db.String(100), nullable=False)<\/pre>\r\n<p style=\"text-align: justify\">Nagu n\u00e4ha, siis andmet\u00fc\u00fcbid on siin meie \u00f5pitust erinevad, kuid sisuliselt k\u00e4itub siin <em>String(n)<\/em> sarnaselt nagu v<em>archar(n)<\/em>. Etteruttavalt v\u00f5ib \u00f6elda, et kui p\u00e4rast tabeli\u00a0<em>Kommentaar<\/em> loomist seda DBeaveris uurida, on n\u00e4ha, et andmet\u00fc\u00fcbiks on salvestatud siiski <em>varchar<\/em>, mitte <em>String<\/em>. Pane ka t\u00e4hele, et sisu korral piirasime me t\u00e4hem\u00e4rkide arvu 1000 peale. V\u00f5ib-olla on see m\u00f5ne veebilehe kommentaari jaoks liiga v\u00e4ike arv t\u00e4hem\u00e4rke, kuid \u00fctleme, et selle veebilehe jaoks on see piisav.<\/p>\r\n<p style=\"text-align: justify\">Selleks, et hiljem vajadusel kommentaari kohta infot v\u00e4ljastada, tuleb lisada j\u00e4rgnevad read klassi <em>Kommentaar<\/em>:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def __repr__(self):\r\n    return 'Kommentaar ' + str(self.id)<\/pre>\r\nSeega klass <em>Kommentaar<\/em> peab v\u00e4lja n\u00e4gema selline:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">class Kommentaar(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    sisu = db.Column(db.String(1000), nullable=False)\r\n    autor = db.Column(db.String(100), nullable=False)\r\n    \r\n    def __repr__(self):\r\n        return 'Kommentaar ' + str(self.id)<\/pre>\r\n<p style=\"text-align: justify\">N\u00fc\u00fcd seome eelmises peat\u00fckis loodud veebivormi andmebaasiga. Selleks muuda meetod <em>Avaleht<\/em> selliseks:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">@app.route('\/', methods=['POST', 'GET'])\r\ndef avaleht():\r\n    if request.method == 'POST':\r\n        sisestatud_sisu = request.form['sisu']\r\n        sisestatud_autor = request.form['autor']\r\n        uus_kommentaar = Kommentaar(sisu=sisestatud_sisu, autor=sisestatud_autor)\r\n        db.session.add(uus_kommentaar)\r\n        db.session.commit()\r\n        return redirect('\/')\r\n    else:\r\n        kommentaarid_andmebaasist = Kommentaar.query.all()\r\n        return render_template('avaleht.html', kommentaarid=kommentaarid_andmebaasist)<\/pre>\r\n<p style=\"text-align: justify\">Kui tegu on \"POST\" meetodiga, soovime me kasutaja sisestatud andmed andmebaasi salvestada. Selleks loome me kasutaja sisestatud andmete p\u00f5hjal uue kommentaari ning lisame selle andmebaasi. Vastasel juhul soovime me kuvada k\u00f5ikide andmebaasis olevate kommentaaride sisu ja autorid veebilehele. Selleks p\u00e4rime me andmebaasist k\u00f5ik kommentaarid ning renderdame need avalehele.<\/p>\r\n<p style=\"text-align: justify\">Kokku saame n\u00fc\u00fcd <em>app.py <\/em>sisuks:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from flask_sqlalchemy import SQLAlchemy\r\nfrom flask import Flask, render_template, request, redirect\r\n\r\napp.config['SQLALCHEMY_DATABASE_URI'] = 'ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA' # andmebaasi asukoht\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # muudatuste j\u00e4lgimise s\u00fcsteemi s\u00e4tted\r\ndb = SQLAlchemy(app) # andmebaasiga \u00fchendamine\r\n\r\nclass Kommentaar(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    sisu = db.Column(db.String(1000), nullable=False)\r\n    autor = db.Column(db.String(100), nullable=False)\r\n    \r\n    def __repr__(self):\r\n        return 'Kommentaar ' + str(self.id)\r\n    \r\n@app.route('\/', methods=['POST', 'GET'])\r\ndef avaleht():\r\n    if request.method == 'POST':\r\n        sisestatud_sisu = request.form['sisu']\r\n        sisestatud_autor = request.form['autor']\r\n        uus_kommentaar = Kommentaar(sisu=sisestatud_sisu, autor=sisestatud_autor)\r\n        db.session.add(uus_kommentaar)\r\n        db.session.commit()\r\n        return redirect('\/')\r\n    else:\r\n        kommentaarid_andmebaasist = Kommentaar.query.all()\r\n        return render_template('avaleht.html', kommentaarid=kommentaarid_andmebaasist)<\/pre>\r\n<p style=\"text-align: justify\">Selleks, et n\u00fc\u00fcd reaalselt meie rakendus PostgreSQL andmebaasiga \u00fchendada ning meie andmebaasi tabel nimega <em>Kommentaar <\/em>luua, kirjuta Thonny k\u00e4sureale k\u00f5igepealt<em><code> from app import db<\/code><\/em> ja seej\u00e4rel <code>db.create_all()<\/code><em>.<\/em><\/p>\r\n\r\n<blockquote><em><code>&gt;&gt;&gt;\u00a0 from app import db\r\n<\/code><\/em><em><code>&gt;&gt;&gt;\u00a0 db.create_all()<\/code><\/em><\/blockquote>\r\n<p style=\"text-align: justify\">Kui veateateid ei ilmunud, v\u00f5ite vaadata DBeaveris andmebaasi, mille all me varasemalt toimetanud oleme (<em>public<\/em>). Seal all peaks n\u00fc\u00fcd olema n\u00e4htaval tabel <em>Kommentaar<\/em>, millel on <em>app.py<\/em> klassis <em>Kommentaar<\/em> t\u00e4psustatud tunnused \u2013 <em>id<\/em>, <em>sisu<\/em> ja <em>autor<\/em>. Kui tabelit pole n\u00e4ha, siis v\u00e4rskendage andmebaasi vaadet (parem klikka andmebaasil <em>public<\/em> ja vali avanenud valikutest <em>Refresh).<\/em><\/p>\r\n<img class=\" wp-image-1223 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar-300x225.png\" alt=\"\" width=\"1024\" height=\"768\" \/>\r\n<p style=\"text-align: justify\"><strong><span style=\"color: #ff0000\">NB!<\/span><\/strong> Kui teil ilmus PostgreSQL'iga \u00fchendades viga, siis kontrollige oma andmebaasi asukohta ning veenduge, et see oleks \u00f5igel kujul ning k\u00f5ik v\u00e4ljatoodud kohad said asednatud \u00f5igete v\u00e4\u00e4rtustega. Kui see ei aidanud, kontrollige et, DBeaveris oleks kindlasti olemas skeema nimega <em>public<\/em>, millega me varasemates peat\u00fckkides t\u00f6\u00f6d teinud oleme ning mida me skeema asemel andmebaasiks nimetasime. Kui seda seal pole, parem klikka vasakul men\u00fc\u00fcs valiku <em>Schemas<\/em> peal ning vali avanenud valikutest\u00a0<em>Create New Schema<\/em>. M\u00e4rgi uue skeema nimeks <em>public.<\/em><\/p>\r\n<img class=\" wp-image-1224 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu-300x226.png\" alt=\"\" width=\"1024\" height=\"771\" \/>\r\n<p style=\"text-align: justify\">N\u00fc\u00fcd olemegi me oma veebirakenduse valmis saanud. K\u00e4ivitage Thonny\u2019s <em>app.py\u00a0<\/em>ja vaadake meie loodud veebilehte aadressilt <a href=\"http:\/\/127.0.0.1:5000\/\">http:\/\/127.0.0.1:5000\/<\/a>.<\/p>\r\n<p style=\"text-align: justify\">Kui te sisestate m\u00f5ne kommentaari ning selle autori, siis vaadake ka DBeaverisse <span class=\"aCOpRe\">\u2013<\/span> tabeli <em>Kommentaar<\/em> vahelehe <em>data<\/em> all peaks olema n\u00e4htaval k\u00f5ik teie lisatud kommentaarid.<\/p>\r\n<img class=\" wp-image-1233 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega-300x225.png\" alt=\"\" width=\"1024\" height=\"768\" \/>\r\n\r\n&nbsp;\r\n\r\n<img class=\" wp-image-1229 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1-300x225.png\" alt=\"\" width=\"1024\" height=\"768\" \/>","rendered":"<p style=\"text-align: justify\">Eelmises peat\u00fckis l\u00f5ime me veebilehe \u00fcldise struktuuri. Selles peat\u00fckis vaatame, kuidas \u00fchendada meie veebirakendus PostgreSQL andmebaasiga.<\/p>\n<p style=\"text-align: justify\">Selleks lisa esmalt faili algusesse rida<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from flask_sqlalchemy import SQLAlchemy<\/pre>\n<p style=\"text-align: justify\">N\u00fc\u00fcd tuleb t\u00e4psustada, kus asub andmebaas, millega me soovime \u00fchendust luua. PostgreSQL korral on andmebaasi aaadressi \u00fcldkuju j\u00e4rgnev:<\/p>\n<p style=\"text-align: justify\"><code>postgres+psycopg2:\/\/<span style=\"color: #008000\">SinuKasutaja<\/span>:<span style=\"color: #008000\">SinuParool<\/span>@localhost:5432\/<span style=\"color: #008000\">SinuAndmebaasiNimi<\/span><\/code><\/p>\n<p style=\"text-align: justify\">Siin tuleb asendada roheliseks tehtud kohad \u00f5igete v\u00e4\u00e4rtustega. Selleks, et leida enda andmebaasi kasutaja, parool ja nimi, tehke j\u00e4rgnevat:<\/p>\n<ol>\n<li style=\"text-align: justify\">Avage DBeaver<\/li>\n<li style=\"text-align: justify\">Minge DBeaveri men\u00fc\u00fcs <em>Window<\/em> -&gt; <em>Database Navigator<\/em><\/li>\n<li style=\"text-align: justify\">N\u00fc\u00fcd on vasakul n\u00e4ha <em>Database Navigator <\/em>men\u00fc\u00fcd<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-794\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-300x228.png\" alt=\"\" width=\"715\" height=\"544\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-300x228.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-1024x779.png 1024w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-768x585.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-65x49.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-225x171.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator-350x266.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/database_navigator.png 1114w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" \/><\/li>\n<li style=\"text-align: justify\"><em>Database Navigator m<\/em>en\u00fc\u00fcs peaks olema n\u00e4htaval \u00fcks andmebaas, antud n\u00e4ites on selle nimeks <em>postgres<\/em>. Parem klikka sellel andmebaasil ja avanenud men\u00fc\u00fcs vali <em>Edit Connection.<br \/>\n<\/em><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-795\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-300x229.png\" alt=\"\" width=\"715\" height=\"546\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-300x229.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-1024x780.png 1024w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-768x585.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-65x50.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-225x171.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus-350x267.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaas_menuus.png 1113w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" \/><\/li>\n<li style=\"text-align: justify\">Avanevas aknas ongi n\u00e4ha sinu andmebaasi nimi (<em>Database) <\/em>ning kasutaja (<em>Username)<\/em>. Samuti on seal olemas peidetud kujul sinu parool. Parooliks peaks olema \u2018parool\u2019, eeldusel, et te andmebaasi luues kasutasite juhendis olevat parooli. Kui te otsustasite parooli muuta, tuleb see teil endal meelde tuletada. Ehk siis selle n\u00e4ite korral oleks andmebaasi asukohaks<br \/>\n<code>postgres+psycopg2:\/\/<span style=\"color: #008000\">postgres<\/span>:<span style=\"color: #008000\">parool<\/span>@localhost:5432\/<span style=\"color: #008000\">postgres<\/span><\/code>.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-796\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaasi_andmed-300x233.png\" alt=\"\" width=\"718\" height=\"558\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaasi_andmed-300x233.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaasi_andmed-65x51.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaasi_andmed-225x175.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaasi_andmed-350x272.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/andmebaasi_andmed.png 740w\" sizes=\"auto, (max-width: 718px) 100vw, 718px\" \/><\/li>\n<\/ol>\n<p style=\"text-align: justify\">N\u00fc\u00fcd kui andmebaasi asukoht on leitud, lisa faili <em>app.py<\/em> rea <code>app = Flask(__name__)<\/code> j\u00e4rele:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">app.config['SQLALCHEMY_DATABASE_URI'] = 'ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA' # andmebaasi asukoht\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # muudatuste j\u00e4lgimise s\u00fcsteemi s\u00e4tted\r\ndb = SQLAlchemy(app) # andmebaasiga \u00fchendamine<\/pre>\n<p style=\"text-align: justify\">Pane t\u00e4hele, et andmebaasi asukoht tuleb asendada ennist leitud PostgreSQL andmebaasi asukohaga. Lisa see v\u00e4\u00e4rtuse <code><span style=\"color: #008000\">ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA<\/span> <\/code>asemele \u00fclakriipsude vahele.<\/p>\n<p style=\"text-align: justify\">J\u00e4rgmisena tuleb m\u00e4\u00e4rata \u00e4ra meie loodava tabeli struktuur. Et me soovime kommentaari korral salvestada selle sisu ning autorit, loomegi tabeli <em>Kommentaar<\/em> tunnustega <em>sisu <\/em>ja <em>autor. <\/em>Kuna igale tabelile on vaja ka primaarv\u00f5tit, lisame tabelile <em>Kommentaar <\/em>ka tunnuse <em>id<\/em>, mis saabki primaarv\u00f5tmeks. Kuna me ei taha, et kommentaari sisu ning autor oleksid t\u00fchjad, lisame n\u00f5ude, et nende tunnuste v\u00e4\u00e4rtused ei tohi t\u00fchjad olla (nullable = False).<\/p>\n<p style=\"text-align: justify\">Selleks, et tabelit <em>Kommentaar<\/em> Flask-SQLAlchemy toel luua, peame me koodi lisama j\u00e4rgneva klassi:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">class Kommentaar(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    sisu = db.Column(db.String(1000), nullable=False)\r\n    autor = db.Column(db.String(100), nullable=False)<\/pre>\n<p style=\"text-align: justify\">Nagu n\u00e4ha, siis andmet\u00fc\u00fcbid on siin meie \u00f5pitust erinevad, kuid sisuliselt k\u00e4itub siin <em>String(n)<\/em> sarnaselt nagu v<em>archar(n)<\/em>. Etteruttavalt v\u00f5ib \u00f6elda, et kui p\u00e4rast tabeli\u00a0<em>Kommentaar<\/em> loomist seda DBeaveris uurida, on n\u00e4ha, et andmet\u00fc\u00fcbiks on salvestatud siiski <em>varchar<\/em>, mitte <em>String<\/em>. Pane ka t\u00e4hele, et sisu korral piirasime me t\u00e4hem\u00e4rkide arvu 1000 peale. V\u00f5ib-olla on see m\u00f5ne veebilehe kommentaari jaoks liiga v\u00e4ike arv t\u00e4hem\u00e4rke, kuid \u00fctleme, et selle veebilehe jaoks on see piisav.<\/p>\n<p style=\"text-align: justify\">Selleks, et hiljem vajadusel kommentaari kohta infot v\u00e4ljastada, tuleb lisada j\u00e4rgnevad read klassi <em>Kommentaar<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">def __repr__(self):\r\n    return 'Kommentaar ' + str(self.id)<\/pre>\n<p>Seega klass <em>Kommentaar<\/em> peab v\u00e4lja n\u00e4gema selline:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">class Kommentaar(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    sisu = db.Column(db.String(1000), nullable=False)\r\n    autor = db.Column(db.String(100), nullable=False)\r\n    \r\n    def __repr__(self):\r\n        return 'Kommentaar ' + str(self.id)<\/pre>\n<p style=\"text-align: justify\">N\u00fc\u00fcd seome eelmises peat\u00fckis loodud veebivormi andmebaasiga. Selleks muuda meetod <em>Avaleht<\/em> selliseks:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">@app.route('\/', methods=['POST', 'GET'])\r\ndef avaleht():\r\n    if request.method == 'POST':\r\n        sisestatud_sisu = request.form['sisu']\r\n        sisestatud_autor = request.form['autor']\r\n        uus_kommentaar = Kommentaar(sisu=sisestatud_sisu, autor=sisestatud_autor)\r\n        db.session.add(uus_kommentaar)\r\n        db.session.commit()\r\n        return redirect('\/')\r\n    else:\r\n        kommentaarid_andmebaasist = Kommentaar.query.all()\r\n        return render_template('avaleht.html', kommentaarid=kommentaarid_andmebaasist)<\/pre>\n<p style=\"text-align: justify\">Kui tegu on &#8220;POST&#8221; meetodiga, soovime me kasutaja sisestatud andmed andmebaasi salvestada. Selleks loome me kasutaja sisestatud andmete p\u00f5hjal uue kommentaari ning lisame selle andmebaasi. Vastasel juhul soovime me kuvada k\u00f5ikide andmebaasis olevate kommentaaride sisu ja autorid veebilehele. Selleks p\u00e4rime me andmebaasist k\u00f5ik kommentaarid ning renderdame need avalehele.<\/p>\n<p style=\"text-align: justify\">Kokku saame n\u00fc\u00fcd <em>app.py <\/em>sisuks:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from flask_sqlalchemy import SQLAlchemy\r\nfrom flask import Flask, render_template, request, redirect\r\n\r\napp.config['SQLALCHEMY_DATABASE_URI'] = 'ASENDA_ENDA_ANDMEBAASI_ASUKOHAGA' # andmebaasi asukoht\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # muudatuste j\u00e4lgimise s\u00fcsteemi s\u00e4tted\r\ndb = SQLAlchemy(app) # andmebaasiga \u00fchendamine\r\n\r\nclass Kommentaar(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    sisu = db.Column(db.String(1000), nullable=False)\r\n    autor = db.Column(db.String(100), nullable=False)\r\n    \r\n    def __repr__(self):\r\n        return 'Kommentaar ' + str(self.id)\r\n    \r\n@app.route('\/', methods=['POST', 'GET'])\r\ndef avaleht():\r\n    if request.method == 'POST':\r\n        sisestatud_sisu = request.form['sisu']\r\n        sisestatud_autor = request.form['autor']\r\n        uus_kommentaar = Kommentaar(sisu=sisestatud_sisu, autor=sisestatud_autor)\r\n        db.session.add(uus_kommentaar)\r\n        db.session.commit()\r\n        return redirect('\/')\r\n    else:\r\n        kommentaarid_andmebaasist = Kommentaar.query.all()\r\n        return render_template('avaleht.html', kommentaarid=kommentaarid_andmebaasist)<\/pre>\n<p style=\"text-align: justify\">Selleks, et n\u00fc\u00fcd reaalselt meie rakendus PostgreSQL andmebaasiga \u00fchendada ning meie andmebaasi tabel nimega <em>Kommentaar <\/em>luua, kirjuta Thonny k\u00e4sureale k\u00f5igepealt<em><code> from app import db<\/code><\/em> ja seej\u00e4rel <code>db.create_all()<\/code><em>.<\/em><\/p>\n<blockquote><p><em><code>&gt;&gt;&gt;\u00a0 from app import db<br \/>\n<\/code><\/em><em><code>&gt;&gt;&gt;\u00a0 db.create_all()<\/code><\/em><\/p><\/blockquote>\n<p style=\"text-align: justify\">Kui veateateid ei ilmunud, v\u00f5ite vaadata DBeaveris andmebaasi, mille all me varasemalt toimetanud oleme (<em>public<\/em>). Seal all peaks n\u00fc\u00fcd olema n\u00e4htaval tabel <em>Kommentaar<\/em>, millel on <em>app.py<\/em> klassis <em>Kommentaar<\/em> t\u00e4psustatud tunnused \u2013 <em>id<\/em>, <em>sisu<\/em> ja <em>autor<\/em>. Kui tabelit pole n\u00e4ha, siis v\u00e4rskendage andmebaasi vaadet (parem klikka andmebaasil <em>public<\/em> ja vali avanenud valikutest <em>Refresh).<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1223 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar-300x225.png\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar-300x225.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar-768x576.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar-65x49.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar-225x169.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar-350x263.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/tabel_kommentaar.png 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p style=\"text-align: justify\"><strong><span style=\"color: #ff0000\">NB!<\/span><\/strong> Kui teil ilmus PostgreSQL&#8217;iga \u00fchendades viga, siis kontrollige oma andmebaasi asukohta ning veenduge, et see oleks \u00f5igel kujul ning k\u00f5ik v\u00e4ljatoodud kohad said asednatud \u00f5igete v\u00e4\u00e4rtustega. Kui see ei aidanud, kontrollige et, DBeaveris oleks kindlasti olemas skeema nimega <em>public<\/em>, millega me varasemates peat\u00fckkides t\u00f6\u00f6d teinud oleme ning mida me skeema asemel andmebaasiks nimetasime. Kui seda seal pole, parem klikka vasakul men\u00fc\u00fcs valiku <em>Schemas<\/em> peal ning vali avanenud valikutest\u00a0<em>Create New Schema<\/em>. M\u00e4rgi uue skeema nimeks <em>public.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1224 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu-300x226.png\" alt=\"\" width=\"1024\" height=\"771\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu-300x226.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu-768x577.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu-65x49.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu-225x169.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu-350x263.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/skeema_puudu.png 1023w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p style=\"text-align: justify\">N\u00fc\u00fcd olemegi me oma veebirakenduse valmis saanud. K\u00e4ivitage Thonny\u2019s <em>app.py\u00a0<\/em>ja vaadake meie loodud veebilehte aadressilt <a href=\"http:\/\/127.0.0.1:5000\/\">http:\/\/127.0.0.1:5000\/<\/a>.<\/p>\n<p style=\"text-align: justify\">Kui te sisestate m\u00f5ne kommentaari ning selle autori, siis vaadake ka DBeaverisse <span class=\"aCOpRe\">\u2013<\/span> tabeli <em>Kommentaar<\/em> vahelehe <em>data<\/em> all peaks olema n\u00e4htaval k\u00f5ik teie lisatud kommentaarid.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1233 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega-300x225.png\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega-300x225.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega-768x576.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega-65x49.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega-225x169.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega-350x263.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebileht_andmetega.png 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1229 aligncenter\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1-300x225.png\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1-300x225.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1-768x576.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1-65x49.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1-225x169.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1-350x263.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/04\/veebilehe_andmed_dbeaver-1.png 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n","protected":false},"author":33,"menu_order":12,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-1222","chapter","type-chapter","status-publish","hentry"],"part":3,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/1222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/users\/33"}],"version-history":[{"count":18,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/1222\/revisions"}],"predecessor-version":[{"id":1392,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/1222\/revisions\/1392"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/parts\/3"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/1222\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/media?parent=1222"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapter-type?post=1222"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/contributor?post=1222"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/license?post=1222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}