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:
Ú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.
Jmenuju se Petr Blahoš. Programuju něco přes 20 let. Tady se snažím psát hlavně o Pythonu, webovém frameworku Pyramid, a občas i o něčem úplně jiném.
Přečteno 19 223×
Přečteno 11 850×
Přečteno 9 340×
Přečteno 8 799×
Přečteno 8 590×