Zkratka k modelu

26. 5. 2013 20:03 Petr Blahoš

Ve škole se mi hrozně líbil Smalltalk. A to proto, že to bylo takové obrovské prostředí, které bylo napsáno ve Smalltalku, všechno to v tom běželo, když jste programovali, tak jste vlastně byli přímo v tom systému, a rozšířili jste ho o to, co jste tam napsali. (Disclaimer: Moje znalosti už tenkrát byly strašně povrchní, takže něco v tom naprogramovat – to ano. Ale jak se řešily takové drobnosti, jako bezpečnost, to jsem ani tenkrát neměl šajnu. Tenkrát mě to ani nezajímalo.) Proč to tady píšu? Protože ono to člověka donutí napsat ty věci tak, aby se daly používat. Kdekoliv, odkudkoliv, a kolikrát je potřeba.

Model podle Pylons project

Už v Pylons 1 byla aplikace organizována tak, že model se vlastně nadefinoval, jako sada globálních proměnných. Ty se v nějakém inicializačním kódu nastavily, a pak použily tak, že se importovaly. Stejný způsob předhazuje i Pyramid, když použijete scaffolding alchemy. Když si uděláte pcreate -s alchemy TMODEL, tak se vytvoří i soubor models.py, který nás navede na vytvoření ORM modelů jako globálních tříd, což je vpořádku, ale zároveň vytvoří globální session (DBSession), což už je diskutabilní. V topmost __init__.py najdeme import DBSession a Base, ale taky inicializaci enginu, a jeho připojení k DBSession a taky k Base všech ORM modelů:

    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine
Takže jsme skončili se Session jako globální proměnnou. Hmm. V testech se to řeší z mého pohledu docela šíleným způsobem – prostě se ta globální proměnná zinicializuje.

Enter pyMongo

V návodu, jak zakomponovat mongodb do pyramid jsem viděl zajímavou věc. Na event pro NewRequest si pověsí funkcičku, která k novému requestu přidá property – právě tu databázi. Je tam něco jako:

    event.request.db = db
Ve view (kterému přijde request jako parametr), pak použijeme request.db. Jak s testováním? Připravím si vlastní model (ať už mock, nebo s testovací databází), a v testech pro jednotlivá views si prostě přiřadím ten správný model k dummy requestu.

pyramid_locmako

Protože se mi přístup pyramid_mongo líbí, přidal jsem něco podobného, ale s SQLAlchemy do svého pyramid_locmako. Jak řekl inspektor Drebbin: Není to nic moc, ale na plat poctivýho poldy je to dobrý. V defaultním nastavení vám to na request připojí property db, což je SQLAlchemy Session. V testech můžete použít mock model, nebo session na testovací databázi.

Je to ale vlastně jenom ukázka toho, jak to jde udělat. Třeba já ve svých projektech nepovažuju ORM ještě za model, stavím něco víc custom (ať už nad ORMem, nebo přímo nad tabulkami), takže si v requestu nebudu předávat session, ale nějaký ten objekt model (nebo dva, nebo tři když na to přijde). Nebo se můžu rozhodnout, že už je opravdu na čase podívat se pořádně na ten traversal a resource tree…

Sdílet