Django, mint adatbazis eleresi reteg
Csykinnek fejlesztettem nemreg egy szoftvert (lenyegtelen mit csinal), python alapu, es mysql-t hasznal az adatok tarolasara. Termeszetesen az alkalmazas egyetlen DBHandler nevu osztalyon keresztul kapcsolodik az adatbazishoz, aminek egy leszarmaztatott osztalya a MysqlDBHandler, igy egy sor modositasaval (es egy uj adatbaziskezelo osztaly hozzaadasaval) barmilyen mas adatbazis is hasznalhato lenne. De ebben nincs semmi kulonos, ezt minimum igy illik csinalni.
Viszont a mysql adatbazist ha a valaki az alkalmazason kivulrol szeretne piszkalni, akkor mar nincs olyan jo dolga, vagy parancssorozik, phpmysqladminozik, esetleg ir hozza valami feluletet, amin keresztul nezegetheti. Ellenben eszembe jutott, hogy mi lenne, ha az adatok tarolasara a djangot kernem meg - ezesetben a generalt admin feluleten keresztul egyszeruen elerhetem az adatokat, sot szep webes statisztikakat is eleg egyszeruen tudok utana csinalni. Ugyhogy nekialltam...
Lassuk egy peldan keresztul, hogy hogyan mukodik a dolog.
Adott egy Mokus nevu objektumunk, ami mondjuk rendelkezik farokhossz, szin es nev tulajdonsagokkal, ahol mondjuk a nev az egyedi.
Nezzuk eloszor, hogy a hagyomanyos modszerrel kb. hogyan nezhetne ki a kezelese:
SQL:
create table mokus ( nev varchar(50) not null primary key, farokhossz integer not null, szin varchar(50) not null )
Python oldalon ilyenkor valami ilyesmi lehet:
class Mokus:
def __init__(self, nev, farokhossz, szin):
self.nev = nev
self.farokhossz = farokhossz
self.szin = szin
class MysqlDBHandler(DBHandler):
# most itt a kapcsolodast meg ezeket nem reszleteznem
...
def getMokus(sef, nev):
self.cursor.execute("SELECT nev, farokhossz, szin FROM mokus WHERE nev=%s", nev)
result = self.cursor.fetchall()[0]
return Mokus(nev=result[0], farokhossz=result[1], szin=result[2])
def updateMokus(self, mokus):
self.cursor.execute("UPDATE mokus SET farokhossz=%(farokhossz)s, szin=%(szin)s WHERE nev=%(nev)s",
{"nev": mokus.nev, "farokhossz": mokus.farokhossz, "szin": mokus.szin})
def allMokus(self):
self.cursor.execute("SELECT nev, farokhossz, szin FROM mokus")
result = self.cursor.fetchall()
mokusList = []
for mokus in result:
mokusList.append(Mokus(result[0], result[1], result[2]))
return mokusList
... csak nagyvonalakban.
Viszont ha ugyanezt django segitsegevel szeretnenk megvalositani, akkor sincs nehezebb dolgunk, sot.
A Mokus osztalyt most egyenesen django modelkent adjuk meg (reszletekbe most nem megyek bele, hogy miert, meg mi micsoda, itt a tutorial), valahogy igy:
from django.db import models
class Mokus(models.Model):
nev = models.CharField("Nev", maxlegth=50, primary_key=True)
farokhossz = models.IntegerField("Farokhossz")
szin = models.CharField("Szin")
# ezutan johet az admin resz konfiguracioja...
A DjangoDBHandler osztaly pedig:
# par - nem egyertelmu - dolog, hogy a djangot hasznalhassuk "kivulrol"
import sys, os
sys.path.append("ahol a mokusos django site-unk van")
os.environ['DJANGO_SETTINGS_MODULE'] = 'djangomokus.settings'
# beimportaljuk a Mokus osztalyt
from djangomokus.mokusapp.models import Mokus
class DjangoDBHandler(DBHandler):
def getMokus(self, nev):
return Mokus.objects.filter(nev=nev).get()
def updateMokus(self, mokus):
mokus.save()
def allMokus(self):
return Mokus.objects.all()
Ennyi.
Hogy kinek melyik tetszik az mar nem az en dolgom
június 29th, 2007 at 12:55:42
ez hasonlít a Ruby-ra nem?
június 29th, 2007 at 15:46:57
Nem. A ruby hasonlit erre
(az picit ujabb, ezert picit "szebb")