web.py – databáze

Dnes se nebudeme věnovat ničemu jinému než paměti aplikací – databázím. Povíme si o různých pojetích práce s databázemi, o potřebných knihovnách a nakonec si předvedeme jednotlivé funkce.

Seriál: Webový framework web.py (5 dílů)

  1. Úvod do webového frameworku web.py 14.11.2013
  2. web.py – první aplikace 22.11.2013
  3. web.py – šablonovací systém 9.12.2013
  4. web.py – databáze 27.12.2013
  5. web.py – autentizace a autorizace 1.9.2014

V minulých dílech už jsme se věnovali základu frameworku i šablonám, nic už nám tedy nebrání v tvorbě webových aplikací. Co nám ale nejspíš bude při vývoji scházet, je úložistě dat, tedy databáze.

Práce s databázemi

Web.py standardně obsahuje moduly pro práci s SQL databázemi v rámci klasického relačního modelu. Tomuto nejrozšířenějšímu způsobu práce s databázemi se budeme věnovat i my.

Pokud byste ale raději pracovali technikou ORM (objektově relační mapování), můžete využít například modul Pythonu SQLAlchemy. Návod na jeho zprovoznění najdete na stránkách projektu web.py http://webpy.org/cookbook/sqlalchemy.

Knihovny

Aby mohl web.py komunikovat s databázemi, potřebuje mezivrstvu zajišťující kontakt mezi databázovým serverem a Pythonem. Pro komunikaci s MySQL slouží například knihovna MySQLdb. Pro Postgres můžete využít balíček Psycopg. A do třetice, pro minimalistickou souborovou databázi SQLite existuje knihovna pysqlite.

Tyto balíčky je možné nainstalovat z uvedených odkazů. Pokud používáte Linux, můžete je najít v repozitářích (například konektor MySQL pod názvem python-mysqldb apod.).

Funkce

Nyní už si konečně popíšeme jednotlivé funkce knihovny database, připojení k databázi a zasílání SQL dotazů.

Připojení k databázi

Než začnete zasílat dotazy do databáze, je nutná krátká konfigurace připojení, web.py se pak postará o jeho návázání i zrušení.

db = web.database(dbn='typ', user='jmeno', pw='heslo', db='jmeno_databaze')

Typ databáze může být například mysql, postgres či sqlite3. Při použití SQLite není nutné zadávat uživatelské jméno ani heslo, pouze cestu k souboru databáze do proměnné db.

Pokud se databáze nachází na jiném počítači (není na adrese localhost), je třeba její adresu zapsat do proměnné host.

Poolování

Pokud počítáte s vysokým zatížením aplikace, můžete do aplikace přidat tzv. connection pooling, který „recykluje“ spojení s databází. Tato funkce je automaticky aktivována, pokud je dostupný modul Pythonu DBUtils.

Pokud máte tento modul nainstalován, ale nechcete jej u daného spojení používat, stačí při tvorbě spojení přidat argument pooling=False.

Select

Pro zaslání dotazu SELECT stačí zavolat funkci select a předat jí název tabulky. Funkce poté vrátí seznam řádků, k jejich sloupcům lze přistupovat jako ke slovníkovým hodnotám.

seznam = db.select("uzivatele")
for u in uzivatele:
    print u.jmeno

Další argumenty

Dále je možné při volání select přidávat i další SQL argumenty. Abych je nemusel vypisovat zvlášť, zde je příkaz využívající všechny z nich. Argumenty jsou v podstatě „rozkouskovanou“ obdobou SQL dotazů:

databaze = db.select("uzivatele",
                     what="jmeno, mesto", where="id < 100",
                     order="jmeno DESC", group="mesto",
                     limit="50", offset="15")

Prvním argumentem předáváme jméno tabulky, druhým (WHAT) určujeme žádané sloupce, třetím (WHERE) udáváme podmínku pro výběr, čtvrtým (ORDER) určujeme seřazení seznamu, pátým (GROUP) určujeme sdružování do skupin, šestým (LIMIT) určujeme, kolik záznamů se má načíst a sedmým (OFFSET), kde se má s načítáním začít.

Insert

Pomocí funkce insert lze do tabulky vkládat řádky s novými hodnotami. V příkazu stačí určit název tabulky a dále už jen páry nazev_sloupce=hodnota:

id_zaznamu = db.insert('uzivatele', jmeno="Josef", mesto="Letovice")

Funkce vrací id vloženého řádku.

Update

Příkaz update pro úpravu stávajících záznamů je velice podobný příkazu insert, pouze navíc přidáváme argument where, který určuje upravované záznamy.

db.update('uzivatele', where="id=10", jmeno="Karel")

Delete

Pro smazání záznamu pomocí funkce delete stačí předat název tabulky a pomocí argumentu where určit smazávané záznamy.

db.delete('uzivatele', where="id=10")

Query

Pokud vám žádný z vyčtených příkazů nedostačuje, je možné použít funkci query, která volá prosté SQL příkazy.

pocet_uzivatelu = db.query("SELECT COUNT(*) AS pocet_uzivatelu FROM uzivatele")

Proměnné v parametrech

Pokud chcete do argumentů funkcí vkládat proměnné, je třeba je nejdříve předat do argumentu vars v podobě slovníku. K těmto proměnným lze pak v parametru přistupovat pomocí konstrukce $promenna.

Díky tomuto způsobu vkládání proměnných je vstup escapován a SQL dotaz je tak chráněn proti SQL injection.

Vložení proměnné tedy může vypadat takto:

seznam = db.select('uzivatele', vars={'jmeno':"Pavel"}, where="jmeno=$jmeno")

Nebo takto:

slovnik = {'jmeno':"Pavel"}
results = db.select('uzivatele', vars=slovnik, where="jmeno=$jmeno")

Či takto:

slovnik = dict(jmeno="Pavel")
results = db.select('uzivatele', vars=slovnik, where="jmeno=$jmeno")

Testování

Chcete-li, aby aplikace vypisovala sestavený SQL dotaz, stačí do funkce přidat argument _test:

databaze = db.select("uzivatele", _test=True)
<sql: 'SELECT * FROM uzivatele'>

Závěr

To je pro dnešek vše. Příště se budeme věnovat slíbené autorizaci a autentizaci uživatelů.

Absolvent gymnázia a budoucí student FI MUNI se zájmem o programování, Linux, hudbu, elektroniku, umění a černobílou analogovou fotografii. Začal jsem u modrého Dosu, přešel přes C#, Javu a nyní se věnuji hlavně Pythonu, mimo jiné i jako stážista v Red Hatu.

Zdroj: https://www.zdrojak.cz/?p=10740