Python i kamen mudraca
- autor Matija Podravec
- čet 14.1.2010
- 01:58
- 3 komentara
- comment
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.
Sve je pod kontrolom
Session je SQLAlchemy komponenta koja posreduje u komunikaciji s fizičkom bazom podataka i održava skup preslikanih Python objekata. Svaki objekt posjeduje internu oznaku trenutnog stanja, odnosno poznato je radi li se o objektu nastalom preslikavanjem podataka iz baze ili pak o novom objektu. U trenutku potvrde (engl. commit) će komponenta Session na temelju metapodataka generirati SQL upite i sinkronizirati stanje trenutno aktivnih preslikanih objekata sa stanjem u relacijskoj bazi podataka. To znači da će za nove objekte inicirati operaciju INSERT, a za promijenjene preslikane objekte inicirat će operaciju UPDATE. Uz navedeno, Session komponenta omogućuje i kontrolu transakcija, pri čemu su podržane i ugniježđene transakcije.
Komponenta Session sadrži sučelje za programsku izgradnju upita. Sučelje se zasniva na objektu Query koji omogućuje lančano dodavanje raznih uvjeta pretraživanja, sortiranja rezultata, grupiranja ili kreiranje podupita. Dakle, programski je moguće kreirati sve oblike SQL upita, a u slučaju potrebe omogućen je i hibridni pristup, tj. moguće je dio upita ili cijeli upit zadati u obliku teksta. Rezultat izvođenja upita je kolekcija Python objekata koji su nastali preslikavanjem dohvaćenih podataka iz relacijske baze.
Opisani mehanizmi SQLAlchemy programske biblioteke ostvaruju programski uzorak Data Mapper. Radi se o vrlo fleksibilnim i efikasnim mehanizmima koji ipak zahtijevaju dobro poznavanje tehnologija baza podataka. Od SQLAlchemy 0.5 omogućen je i deklarativni oblik ORM-a koji se zasniva na programskom uzorku Active Record. Deklarativni oblik ORM-a nešto je jednostavniji i u osnovi se zasniva na ideji da pravila preslikavanja budu dio preslikanih Python objekata.
Potencijalne nedostatke nije jednostavno pronaći. Mogući je nedostatak sporost u brisanju velikog broja zapisa iz baze podataka jer SQLAlchemy generira i izvodi po jednu DELETE naredbu za svaki zapis. U takvim se slučajevima preporučuje korištenje statički zadanih DELETE naredbi koje jednim pozivom brišu sve potrebne zapise u relacijskoj bazi podataka. Drugi je potencijalni nedostatak relativno dugo vrijeme učenja. Dokumentacija u PDF obliku sadrži preko 200 stranica, što zahtijeva određeno vrijeme za čitanje i razumijevanje.
SQLAlchemy svakako zaslužuje preporuku. Njegove mogućnosti dolaze do izražaja kod većih aplikacijskih sustava i složenijih shema relacijskih baza podataka. SQLAlchemy će sigurno pridonijeti boljoj organiziranosti programskog kôda aplikacijskog sustava, što će za posljedicu imati jednostanije nadogradnje aplikacije u budućnosti.
zadnji komentari na forumu (3)
Ime programa
SQLAlchemy
Tip
Open source ORM Python programska biblioteka
Plus
Fleksibilnost, mnoštvo alata, dokumentacija
Minus
Sporost u brisanju velikog broja zapisa
Dojam
Svakako preporuka
URL
prethodni tekstovi
Novi Windows 8 datotečni sustav
NTFS je mrtav, živio ReFS jučer
MailStore
Arhivator sri 1.2.2012
Draytek Vigor IPPBX 2820
Za glas i Internet pet 13.1.2012
QNAP NAS TS-EC879U-RP
Mali NAS za svakoga čet 5.1.2012
PostgreSQL 9.1
Baza za odrasle pet 9.12.2011
Brother MFC-9970CDW
Radni konj sri 30.11.2011
Samsung Galaxy S+
Non plus ultra sri 16.11.2011
HP ProBook 5330m LG718EA
Mali metalac sri 9.11.2011
Sony Ericsson Xperia ray, mini i mini pro
Mali, manji, najmanji čet 13.10.2011
Oracle Database Appliance
Još jednom – sve u jednom sri 5.10.2011
Cyber Ark Privileged Identity Management Suite
Upravljanje privilegiranim računima sri 28.9.2011
Previranja u HP-u
Kud plovi ovaj brod? čet 22.9.2011
NetApp FAS 2020
Najmanji od najvećih čet 8.9.2011
Splashtop OS
Za 5 sekundi do weba sri 31.8.2011
svi tekstovivezani sadržaji
-
veljača 2009.
Mreža


















SQLAlchemy
"inicijalizaciju sjednice" (session initialization) - jao, bugovci, sramoto, pa dajte da vam tekst barem pročita netko tko se razumije u njega, kad je već očito da ga ne piše nitko takav, nego se radi o lošem (nestručnom) prijevodu tuđeg teksta....