Brian called Brian

14. 11. 2012 21:05 Petr Blahoš

Tak se ve firmě rozhodli, že změní systém řízení databáze u ERP. Takže už všechny sloupce nebudou mít prefix t$ ale t_. Mě osobně je t_ sympatičtější, ale nic to nemění na faktu, že mám pár nástrojů, ve kterých se k té databázi připojuju, a které budu muset upravit. Ještě, že mám SQLAlchemy.

Mám SQLAlchemy, takže vím, že to půjde nějak jednoduše. Vpodstatě řeším 2 problémy. Jeden je, abych v definici tabulek nemusel všude přepisovat t$ na t_. Druhý, abych se pak ve výsledcích mohl odvolávat na sloupce pod původním názvem s t$. Jak tedy na to?

První, co mě napadlo bylo, že když bude nejhůř, tak nahradím funkci pro definici sloupce za jinou, ve které nahradím t$. Pak jsem začal hledat, a došel jsem k relativně funkčnímu řešení: Napsat si vlastní dialect. Na jedné straně je Compiler, který při vytváření selectů (nezmínil jsem, že z databáze pouze čtu) zamění t$, na druhé straně dekorování RowProxy, kde se to změní zpět. Funguje. Na detaily se můžete podívat tady, jestli musíte. Jenže je to špatně, protože dialect je na něco jiného.

Mike Bayer (a ten by to měl vědět) radí dvě možnosti.

  • Použít event system, pro úpravy toho sql dotazu by to byl before_cursor_execute, který se přesně hodí právě na poslední úpravu SQL, a na straně výsledků pak jednu z možností:
    • after_cursor_execute modifikovat .cursor_description pokud to jde, nebo
    • tamtéž udělat wrapper, který bude vracet upravenou .cursor_description, nebo
    • after_execute předělat metadata, nebo
    • tamtéž upravit keymap (tak nějak, jak to dělám v dialectu)
  • Ale spíš doporučuje použít parametr key konstruktoru Column, který umožní právě nazvat si sloupec jinak, než jak je v databázi.
No a protože věřit autorovi by asi bylo na místě, tak jsem to tak udělal. Takže při definici tabulek nepoužívám sqlalchemy.Column(„t$tano“, Integer), ale Column(„t$tano“, Integer), která volá sqlalchemy.Column(„t_tano“, Integer, key=„t$tano“) a všechno perfektně funguje.

Nebo ne? No, vlatně pokud se, jako já, musíte připojovat k MS Sql Serveru, tak k tomu používáte dialekt mssql, který má v současných SQLAlchemy chybu, takže při přístupu k výsledkům nebude právě ten key fungovat. Ale stáhněte si development verzi, tam už je to opraveno…

Sdílet