Hlavní navigace

Modellerkit: dva příklady

31. 8. 2014 17:51 | Petr Blahoš

Znáte sandman? Ten mě inspiroval k vytvoření jednoduché ukázky modellerkitu. Abych připomněl o co jde: Chci systém, pro tvorbu uživatelských rozhraní, ve kterém při změně dat nemusím říkat: Zaktualizuj to tady a tady, pak přepočítej tamto, a zobraz to. Naopak, jak je v MVC zvykem, při změně dat (čili modelu) ta data řeknou: Změnili jsme se!, a kdo poslouchá, ten může patřičně reagovat. Jestli chcete, projděte si detaily. Já teď s pomocí SQLAlchemy vytvořím jednoduchý prográmek, který z databáze stáhne seznam tabulek a jejich strukturu, zobrazí tabulky, a pro vybranou tabulku ukáže její strukturu a pár řádků na ukázku. Kód najdete v github/modellerkit, v examples/sqaview.py. Budete potřebovat SQLAlchemy a wxPython.

Pokud pracujete v Pythonu s databázemi a neznáte SQLAlchemy, tak vězte, že stojí za to. Já vím, že kvalita databázové knihovny nestojí na tom, jestli na zjištění struktury existující databáze potřebujete řádky 3 nebo 30, ale vězte, že SQLAlchemy se dělají dobře i jiné věci.

        engine = create_engine(uri)
        meta = MetaData(bind=engine)
        meta.reflect()
        # tabulky jsou v meta.tables

Ale teď k věci. Náš model obsahuje tyhle horké property:

  • table_names – jména tabulek
  • current_table – aktuálně vybranou tabulku
  • query_params – případné parametry podle nichž lze filtrovat výsledek
  • row_set – výsledné řádky „ukázkového“ selectu
Kromě toho je tam ještě mapa _tables, která mapuje jméno tabulky, na tu vlastní tabulku.

Úplně na začátku trochu podvádím:

hotmodel.IMMUTABLE_TYPES.add(sqlalchemy.schema.Table)
Předstírám, že Table je neměnná, abych ji mohl vůbec používát v horkých strukturách. Předpokládám totiž, že v tomto prográmku tabulku nikdo měnit nebude. Na to bychom potřebovali poněkud jinou infrastrukturu.

A teď jak to celé funguje. Do hlavního okna si naházím 3 tabulky: seznam db. tabulek, právě vybraná tabulka (její sloupce), a řádky tabulky. Nastavím mapper, kde poslouchám na změnu v seznamu tabulek (table_names), což se zde použije jen při inicializaci, výběr tabulky v seznamu, a dokončení databázového dotazu (row_set).

Z view se do modelu musí dostat informace o výběru aktuální tabulky, a změně parametrů dotazu (query_params). Zde přímo volám metody modelu. Při výběry tabulky select_table, která nastaví model.current_table, a při editaci filtru model.run_query, jež provede select s nastavenými parametry, a výsledek stáhne do model.row_set (což vyvolá automatickou aktualizaci row_view). Pozn.: Filtr nastavíte tak, že dvojkliknete ve sloupci Filter, ale nefungovalo mi to v Pythonu 3.

Druhý příklad, examples/matdrier.py je aplikace na sušení materiálu. Předpokládejme, že než můžeme materiál použít, musíme si ho vysušit. Suší se po určitou nepřetržitou dobu při určité teplotě (pro zjednodušení zde dovolíme i vyšší teplotu). Hypoteticky bychom měli k počítači připojen teploměr, který by nám posílal teplotu z pece. To si simulujeme tak, že v UI můžeme nastavit požadovanou teplotu, a ona nám tam pomalu doleze. Jakmile je tedy materiál vysušen, přebarví se na zeleno, a je možné ho z pece vyndat a použít. Nebudu zacházet do detailů, protože je to pořád stejné: Poskládám UI, poskládám model. Napojím model na UI a čekám.

Tím toto téma opustím s tím, že pro moje účely to funguje dobře.