Python i kamen mudraca
- autor Matija Podravec
- sri 20.1.2010
- 20:11
Današnje poslovne aplikacije obično su implementirane u nekom objektno-orijentiranom programskom jeziku, a podatke pohranjuju u relacijskim bazama podataka. Međutim, radi se o dvjema međusobno nekompatibilnim tehnologijama. Jednostavan je dokaz činjenica da relacijske baze podataka ne podržavaju mogućnost nasljeđivanja koje je osnova objektno-orijentiranih programskih jezika. Jedan pokušaj u približavanju tehnologija baza podataka i objektno-orijentiranih jezika jest razvoj objektnih baza podataka koje podatke pohranjuju u obliku objekata te direktno podržavaju mogućnost nasljeđivanja. Iako se u osnovi radi o ispravnoj ideji, tehnologije objektnih baza podataka nisu uspjele ostvariti široku primjenu.
Drugi je pristup prilagodba programskog jezika. Svaki moderni programski jezik posjeduje sučelje za pristup relacijskim bazama podataka. To se sučelje u osnovi sastoji od naredbi za izvođenje SQL upita te od naredbi za iteraciju kroz prikupljeni skup podataka. Ovakva su sučelja jednostavna, ali kod razvoja velikih aplikacijskih sustava pokazuju određene nedostatke. Miješanje dvaju različitih jezika (deklarativni SQL i objektno-orijentirani jezik) može rezultirati programskim kôdom koji je kod velikih aplikacija teško održavati i nadograđivati. Osim toga, potrebno je uložiti dodatan trud u oblikovanju SQL upita kako bi se spriječili SQL injection sigurnosni napadi u kojima napadač može inicirati izvođenje proizvoljnog SQL upita. Treći je potencijalni problem ovisnost aplikacijskog sustava o određenom tipu relacijske baze podataka. Odnosno, iako je SQL jezik standardiziran, proizvođači relacijskih baza podataka često unose vlastite jezične konstrukte, čime onemogućavaju rad aplikacije s bazama podataka drugih proizvođavača.
ORM (engl. object-relational mapper) je programska tehnika koja bi trebala, ako ne ukloniti, onda barem smanjiti opisane probleme. Navedena tehnika obično se ostvaruje u obliku zasebnih programskih biblioteka koje posreduju u komunikaciji između aplikacijskog sustava i baze podataka. Njihova je uloga omogućiti automatizirano preslikavanje tabličnih podataka iz relacijske baze u objekte programskog jezika. Dodatno, biblioteke bi trebale pojednostavniti programsko generiranje SQL upita koji su otporni na SQL injection napade te omogućiti nezavisnost o tipu relacijskih baza podataka.
Rješenje za Python
SQLAlchemy je open source implementacija ORM programske tehnike za programski jezik Python. Prvu verziju biblioteke implementirao je Michael Bayer početkom 2006. godine, a otad je postala najkvalitetniji i najrašireniji ORM alat unutar Python zajednice. Tijekom proteklog vremena došlo je do nekoliko reorganizacija programskog kôda pa tako trenutno postoje tri međusobno nekompatibilne verzije (0.3, 0.4 i 0.5). SQLAlchemy korišten je u implementaciji niza aplikacija, od kojih je možda najpoznatiji web portal reddit.com, jedan od najpopularnijih news agregatora. Do sada je o njemu objavljena jedna knjiga, a druga je u pripremi.
Programska je biblioteka vrlo pažljivo organizirana po modulima, što omogućuje da se pojedini moduli iskoriste nezavisno od ostalih modula. Navedena modularnost potaknula je razvoj raznih nadogradnji ili su pak pojedini moduli iskorišteni kao platforma za razvoj novih ORM alata. Neki od popularnijih nadogradnji su Elixir, Camelot, Migrate, django-sqlalchemy, DBSprockets, FormAlchemy i z3c.sqlalchemy. Osnovu biblioteke SQLAlchemy čine komponente Engine, Metadata, Mapper i Session koje se ukratko opisuju u nastavku teksta. Važno je napomenuti kako je ORM samo jedan dio biblioteke SQLAlchemy.
Početna je komponenta SQLAlchemyja Engine. Komponenta Engine brine se o fizičkim konekcijama prema relacijskoj bazi te pruža podršku dijalektima SQL jezika. Otvaranje konekcija je spor proces jer uključuje stvaranje mrežne konekcije, autentifikaciju te inicijalizaciju sjednice. Engine optimizira ovaj proces održavanjem skupa otvorenih konekcija, odnosno kada konekcija više nije potrebna, Engine je ne zatvara, već je čuva za buduće potrebe. Konekcije je moguće otvarati prema svim popularnim relacijskom bazama podataka: podržani su SQLite, Postgres, MySQL, MS-SQL, Firebird, Informix i Oracle relacijske baze podataka. Svaka od navedenih baza podataka posjeduje neke specifičnosti: npr. Oracle za spajanje dva niza znakova koristi operator ||, dok MySQL koristi funkciju concat. Komponenta Engine s podrškom dijalektima SQL jezika omogućuje pravilno generiranje upita ovisno o tipu relacijske baze podataka.
Komponenta Metadata omogućuje opis strukture baze podataka, tj. definiranje tablica, stupaca, primarnih i stranih ključeva. Navedeni metapodaci o relacijskoj bazi podataka zapisuju se s pomoću SQLAlchemy objekata kao što su Table, Column, ForeignKey, Index i Sequence. Metapodaci se mogu definirati eksplicitno ili se pak mogu automatizirano prikupiti iz aktivne baze podataka (eng. reflection). Kod eksplicitnog definiranja programer ručno opisuje u Python kôdu definicije svih elemenata relacijske baze podataka, a nakon toga, ako je potrebno, može opisane elemente automatizirano fizički kreirati u bazi podataka. Ovime je omogućeno oblikovanje relacijske baze unutar same Python aplikacije, što je jednostavnije i elegantnije rješenje u odnosu na korištenje posebnih administrativnih alata baze podataka. Automatizirano je prikupljanje metapodataka iz već kreirane baze suprotan proces. Metapodaci se u tom slučaju mogu prikupiti za cijelu bazu podataka u potpunosti ili samo za podskup tablica.
Nakon definiranja metapodataka slijedi definiranje Python objekata u koje će se preslikavati tablični podaci iz baze podataka. Ti objekti mogu biti u potpunosti prazni, odnosno mogu sadržavati samo naredbu pass, a mogu i sadržavati dodatne metode ovisno o potrebama aplikacijske logike.
Mapper je SQLAlchemy komponenta kojom se definiraju pravila preslikavanja tablica relacijske baze podataka na Python objekte. Preslikavanja mogu biti u obliku jedna tablica na jedan objekt, ali je moguće definirati i složena preslikavanja u kojima se više združenih tablica preslikava na jedan objekt. Također je moguće ograničiti preslikavanje samo na podskup stupaca tablice, prilikom preslikavanja transformirati podatke, ili pak prilagođavati operatore uspoređivanja.
izdvojeni tekstovi - veljača 2010.
Oleg Maštruko
Ljudi i brodovi (i oglasi na netu) sri 20.1.2010
Prognoze za 2010. godinu
IT na putu iz krize sri 20.1.2010
iRIS radiološki sustav
Informatizirana radiologija sri 20.1.2010
Matko Botinčan, dobitnik Gatesove stipendije za doktorat
Matematika i informatika, dva stara druga sri 20.1.2010
Oglašavanje na Internetu
Kralj je mrtav, živio kralj! sri 20.1.2010
Microsoft Deployment Toolkit 2010
Nužan alat sri 20.1.2010
SQLAlchemy
Python i kamen mudraca sri 20.1.2010
EGNOS
Nova nebeska navigacija sri 20.1.2010
Kako napisati dobar bug report?
Raportiranje po špranci sri 20.1.2010
IT suradnja s Indijom i Indijcima
Crtice iz središta informatike sri 20.1.2010
Novi Zakon o elektroničkim medijima
Sloboda, ali i oprez sri 20.1.2010
















