2012. február 23.

Adatbázis modell újratervezése: Django és South

Ebben az írásban egy módszert fogunk bemutatni, amely lehetővé teszi adatbázisunk modelljének gyors és könnyű fejlesztését, valamint gyors és biztonságos újratervezését. Ehhez a Django webes keretrendszerbe beépített ORM-et fogjuk használni. Tudását kiegészítve és bővítve a South adatbázis migrációkkal.


Először tisztázzuk az eszközválasztást. A Django, a híres jazz gitárosról elnevezett Python nyelven implementált webes keretrendszer egy részét, a Django ORM rendszerét fogjuk használni. A bemutatott példa mégsem elsődlegesen webes megjelenésre tervezzük. Miután adatbázisunkat megterveztük vagy átterveztük, nyugodtan kivehetjük a Django keretrendszer alól. A Django webes keretrendszer egyik nagy előnye, hogy nagyon moduláris. Minden szolgáltatását külön-külön ki- és beemelhetjük. Ez nagy szabadságot ad a keretrendszer felhasználójának és lehetőséget biztosít nagyfokú újrahasznosított kódok, alkalmazások gyártására.

A South

A South, egy a Django ORM-hez csatlakozó alkalmazás. Célja és funkciója, hogy az adatbázis modellek módosítási folyamatába egy újabb lépcsőt iktat. A migrációkat. Ezt az eljárás, a nagy testvérnek minősülő Ruby nyelven implementált Rails keretrendszerből származik. A Railsnél ez a folyamat csak nagy nehezen kapcsolható ki. De kiiktatása, mint ahogy látni fogjuk, nem érdemes.

Miért van szükségünk migrációkra?

Előbb azt mondtuk, hogy egy új lépést vezet be a fejlesztésbe. Ezt most pontosítjuk. Nem csak egy lépést, hanem egy nagyon fontos, a fejlesztési folyamat számára nagyon lényeges plusz lépésről beszélhetünk. Minden egyes módosításáról először egy migrációt készítünk. Az elkészített migráció alapján pedig elvégezhetjük a modell és az adatbázis módosítását. - Ezzel a lépéssel nem csak arra nyílik lehetőségünk, hogy nyomon követhessünk a modellünk és az adatbázisunk fejlődősét. Ha csupán erre lenne lehetőségünk, akkor tekinthetnénk egyszerű adatbázis-verziókövetésnek. Ennél többről van szó. Ezt fogjuk kihangsúlyozni a példánkban is, ahol kifejezetten az adatmigrációkkal foglalkozunk, amely képes a jelenlegi adatokat átalakítani az új modellnek megfelelően. Illetve, képes ezeket a módosításokat vissza is fordítani, ha mégsem lennénk megelégedve az eredménnyel.

A példa alkalmazás

A példa alkalmazásunk modellje csupán egyetlen egy osztályt fog ismerni. Az Account-ot (felhasználó). Egyetlen mezője lesz: a fullname (teljes név). Ezt a nagyon kezdetleges modellünket fogjuk átalakítani úgy, hogy megkülönböztethessük a kereszt- és vezetékneveket. A kereszt- és vezetéknévből pedig mi magunk állíthatjuk elő majd a teljes nevet.

## Szükséges csomagok telepítése
pip install django south
## Telepítés után Django Projekt létrehozása
django-admin startproject SimpleDBAndMigrate
# Belépés a projekt könyvtárába
cd SimpleDBAndMigrate
# Az app létrehozása
django-admin startapp simple
# Választott szerkesztővel megnyitjuk alkalmazásNeve/settings.py -t
emacs ./simple/settings.py
# 1) Database dictionary-ban módosítjuk az adatbázis kapcsolatot.
# A példában én sqlite3-at használtok. Megadok a nevét is!
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test.sqlite',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
# 2) Installáljuk a saját és a külső programokat
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# migraciokert felelo South modul
'south',
# saját alkalmazásunk: projektNeve.alkalmazásNév alakban
'SimpleDBAndMigrate.simple',
# admin felület létrehozása, később mindenképp haszos!
'django.contrib.admin'
)
## A projektünk mappájában állva létrehozzuk az adatbáziskapcsolatot,
# szinkronizáljuk az adatbázissal.
./manage.py syncdb # Ha nem üzemelne, akkor chmod +x ./manage.py-al adjunk jogosultságokat!
## Itt meg fogja kérdezni tőlünk az admin nevét és jelszavát.
# Állítsuk be. Ha később elfelejtetnénk, akkora ./manage.py createsuperuser
# paranccsal újra megadhatjuk.
### Ez volt az első és utolsó alkalom, amikor migrációk nélkül
# szinkronizáljuk az adatbázisunkat.
## Kezdetleges modell létrehozása a ./simple/model.py -ba
class Account(models.Model):
fullname = models.CharField(max_length=100, null=False)
## A modellünk most csak egy Account táblája van,
# aminek egy mezője van, a fullname.
# Ez a fullname 100 karakterhosszú és nem lehet nulla.
## Első migráció ./manage.py schemamigration alkalmazasNevve --inti
./manage.py schemamigration simple --init
## Ha lefutott, akkor végezzük is el az adatbázis módosításokat
./manage.py migrate simple
## Most módosítsuk a modellt (./simple/model.py)
# Adjunk hozzá két mezőt, a first_name-et és a last_name-et.
# Ebből a két adatból fogjuk létrehozni a fullname mező tartalmát.
class Account(models.Model):
fullname = models.CharField(max_length=100, null=False)
first_name = models.CharField(max_length=100, null=False)
last_name = models.CharField(max_length=100, null=False)
## Adatmigráció
./manage.py datamigration simple fullname
## Ezzel a lépéssel létrehozzuk az adatmigrációs fájlt.
# Nyissuk meg és módosítsuk a forwards és backwards függvények tartalmát.
# Ezek a függvények dolgozzák át a jelenlegi modellünk tartalmát az új modellünkre
# illeszkedő tartalommá. A forward az új modellhez igazít,
# a backwards pedig a visszatérést a régi modellhez segíti elő.
def forwards(self, orm):
"Adatok atalakitasa az uj modell szerint"
for user in orm.Account.objects.all():
user.first_name, user.last_name = user.fullname.split(' ') # erdemes kicserelni regexp-re!
user.save()
def backwards(self, orm):
"Adatok helyreallitasa a regi modell szerint"
for user in orm.Account.objects.all():
user.fullname = user.first_name + " " + user.last_name
user.save()
view raw gistfile1.txt hosted with ❤ by GitHub


Összegzés és előnyök

A migráció és a Django ORM-jének bemutatása mellett egy újabb előnyre szeretnénk felhívni a figyelmet és érvelni az ORM-ek használata mellett. Az adatbázisokat soha nem önmagukban használjuk. Ha az adatokat módosítani akarjuk, akkor sem egyből az adatbázisban végezzük el a műveleteket. Sokkal kényelmesebb és biztonságosabb, ha egy külső programot használunk erre a műveletre. Egy külső program megvéd bennünket önmagunktól. Megvéd attól, hogy figyelmetlenségből, ismétlődő feladatok rutinjának monotóniájából hibákat kövessünk el. A külső program pedig sokkal több ellenőrzést és informatívabb visszajelzéseket tud adni számunkra, amikor módosítást szeretnénk eszközölni az adatbázisunkban. - Nem utolsó sorban egy külső program képes a kimenet megváltoztatására, így lehetőségünk van eredményeinket másol által emészthető formában ölteni.

Nincsenek megjegyzések: