
Michael Cain
0
2224
408
Možda ste čuli za objektno-relacijsko mapiranje (ORM). Možda ste je čak i koristili, ali što su točno oni? I kako ih upotrebljavate u Pythonu?
Evo svega što trebate znati o ORM-ovima i Pythonu.
Što je ORM?
Objektno-relacijsko mapiranje (ORM) programska je tehnika koja se koristi za pristup bazi podataka. To otkriva vašu bazu podataka u nizu objekata. Ne morate pisati SQL naredbe za umetanje ili dohvaćanje podataka, koristite niz atributa i metoda priloženih objektima.
Možda zvuči složeno i nepotrebno, ali mogu vam uštedjeti puno vremena i pomoći u kontroli pristupa vašoj bazi podataka.
Evo primjera. Recite da kad god ubacite lozinku u bazu podataka želite je usmjeriti, kao što je objašnjeno u sigurnosti lozinke web mjesta. Svaka sigurna web lokacija to čini sa svojom lozinkom Svaka sigurna web stranica čini ovo vašom lozinkom Jeste li se ikad zapitali kako web stranice čuvaju lozinku sigurnom od podataka povreda? , Ovo nije problem za jednostavne slučajeve upotrebe - napravite izračun prije umetanja. Ali što ako trebate na kod mjesta umetnuti zapis na mnogim mjestima? Što ako drugi programer umetne u vašu tablicu, a vi to ne znate?
Korištenjem ORM-a možete napisati kôd da biste osigurali da se kad god i gdje god pristupi bilo kojem retku ili polju u vašoj bazi podataka prvo izvrši drugi, prilagođeni kôd..
To također djeluje kao a “jedini izvor istine”. Ako želite promijeniti prilagođeni izračun, morate ga promijeniti samo na jednom mjestu, a ne na nekoliko. Mnoge od ovih principa moguće je izvoditi s objektno orijentiranim programiranjem (OOP) u Pythonu Vodič za početnike Python objektno orijentiranom programiranju Vodič za početnike za Python objektno orijentirano programiranje Da biste u potpunosti iskoristili prednosti Pythona, htjet ćete naučiti kako Python radi s objektno orijentiranim programiranjem (OOP). , ali ORM-ovi rade u tandemu s OOP načelima za kontrolu pristupa bazi podataka.
Postoje određene stvari na koje morate paziti pri korištenju ORM-a i postoje okolnosti u kojima možda nećete htjeti upotrijebiti, ali to se uglavnom smatra dobrim stvarima, posebno u velikoj šifri baze podataka.
ORM-ovi u Pythonu pomoću SQLAlchemy-a
Kao i mnogi zadaci u Pythonu, brži je i jednostavniji uvoz modula od pisanja vlastitog. Naravno, moguće je napisati vlastiti ORM, ali zašto izumiti kotač?
Sljedeći primjeri svi koriste SQLAlchemy, popularni Python ORM, ali mnogi se principi primjenjuju bez obzira na implementaciju.
Postavljanje Pythona za SQLAlchemy
Prije nego što uskočite unutra, morat ćete postaviti uređaj za razvoj Pythona pomoću SQLAlchemyja.
Morat ćete koristiti Python 3.6 da biste slijedili zajedno s ovim primjerima. Dok će starije verzije raditi, kod dolje će trebati neke izmjene prije nego što se pokrene. Niste sigurni u razlike? Naše Python FAQ Najčešća pitanja o Python programiranju Najčešća pitanja o Python programiranju U ovom ćemo vam članku proći kroz sve što trebate znati o početniku Pythona. pokriva sve razlike.
Prije kodiranja, trebali biste postaviti Python okruženje Saznajte kako koristiti Python virtualno okruženje Saznajte kako koristiti Python virtualno okruženje Bez obzira jeste li iskusni Python programer ili tek započinjete, učenje kako postaviti virtualno okruženje je neophodno za bilo koji Python projekt. , što će spriječiti probleme s drugim uvoznim Python paketima.
Provjerite imate li PIP, voditelja paketa Python Kako instalirati Python PIP na Windows, Mac i Linux Kako instalirati Python PIP na Windows, Mac i Linux Mnogi programeri Pythona oslanjaju se na alat zvan PIP za Python kako bi sve olakšali i brže. Evo kako instalirati Python PIP. instaliran, koji dolazi s većinom modernih verzija Pythona.
Jednom kada budete spremni za početak, možete početi s pripremanjem SQLAlchemyja. Iz vašeg Python okruženja u naredbenom retku instalirajte SQLAlchemy sa instaliranje pipa naredba:
pip instalacija SQLAlchemy-1.2.9
1.2.9 je broj verzije. To možete ostaviti da biste dobili najnoviji paket, ali dobra je praksa biti specifičan. Ne znate kada bi novo izdanje moglo pokvariti vaš trenutni kod.
Sada ste spremni započeti kodiranje. Možda ćete trebati pripremiti bazu podataka da prihvati Python vezu, ali sljedeći primjeri koriste SQLite bazu podataka stvorenu u memoriji u nastavku.
Modeli u SQLAlchemy
Jedna od ključnih komponenti ORM-a je model. Ovo je klasa Python koja opisuje kako treba izgledati tablica i kako bi trebala raditi. To je ORM verzija USTVARITE TABELU izjava u SQL-u. Trebate model za svaku tablicu u vašoj bazi podataka.
Otvorite svoj omiljeni uređivač teksta ili IDE i stvorite novu datoteku pod nazivom test.py. Unesite ovaj početni kôd, spremite datoteku i pokrenite je:
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import Deklarativni_baza = deklarativni_baza () motor = create_engine ('sqlite: //') # Kreirajte bazu podataka u memoriji Base.metadata.create_all (engine) # Stvorite sve tablice u bazi podataka
Ovaj kod čini nekoliko stvari. Uvoz je nužan kako bi Python shvatio gdje treba pronaći SQLAlchemy module koji su mu potrebni. Vaši će modeli koristiti declarative_base kasnije i konfigurira sve nove modele da rade onako kako se i očekivalo.
create_engine metoda stvara novu vezu s vašom bazom podataka. Ako već imate bazu podataka, morat ćete je promijeniti SQLite: // na URI baze podataka. Ovakav će kôd stvoriti novu bazu podataka samo u memoriji. Baza podataka se uništava nakon završetka izvršavanja vašeg koda.
Napokon create_all metoda stvara sve tablice definirane u vašim načinima u vašoj bazi podataka. Kako još niste definirali nijedan model, neće se dogoditi ništa. Samo napred i pokrenite ovaj kôd da biste osigurali da nemate problema ili pogrešaka pri upisu.
Napravimo model. Dodajte još jedan uvoz na vrh datoteke:
from sqlalchemy import Column, Integer, String
Ovo uvozi Kolona, Integer, i Niz moduli iz SQLAlchemyja. Oni definiraju kako rade tablice, polja, stupci i tipovi baza podataka.
Ispod declarative_base, stvorite svoju klasu modela:
klase Automobili (Baza): __tablename__ = 'automobili' id = Stupac (Integer, Primary_key = True) make = Stupac (String (50), nullable = False) boja = Stupac (String (50), nullable = False)
Ovaj jednostavan primjer koristi automobile, ali vaše tablice mogu sadržavati bilo kakve podatke.
Svaki razred mora naslijediti Baza. Naziv tablice vaše baze podataka definiran je u __tablename__. To bi trebalo biti isto kao i naziv klase, ali ovo je samo preporuka i ništa se neće slomiti ako se ne podudaraju.
Na kraju, svaki je stupac definiran kao python varijabla unutar klase. Koriste se različite vrste podataka i glavni ključ atribut govori SQLAlchemy da stvori iskaznica stupac kao primarni ključ.
Samo naprijed i dodajte posljednji uvoz, ovaj put za Strani kljuc modul. Dodajte ovo uz svoje Kolona uvoz:
from sqlalchemy import Column, ForeignKey, Integer, String
Sada napravite drugu klasu modela. Ova klasa se zove CarOwners, i pohranjuje podatke o vlasnicima određenih automobila pohranjenih u vozilu Automobili stol:
klasa CarOwners (Baza): __tablename__ = 'carowners' id = Stupac (Integer, Primary_key = True) ime = Stupac (String (50), nullable = False) dob = Stupac (Integer, nullable = False) car_id = Stupac (Integer, ForeignKey ('cars.id')) automobil = odnos (automobili)
Ovdje je uvedeno nekoliko novih atributa. car_id polje je definirano kao strani ključ. Povezana je s iskaznica u automobili stol. Zapazite kako se koristi naziv male tablice, koji se temelji na imenu velike klase.
Napokon atribut od automobil definira se kao a odnos. Ovo omogućuje vašem modelu pristup Automobili tablicu kroz ovu varijablu. To je prikazano u nastavku.
Ako sada pokrenete ovaj kod, vidjet ćete da se ništa ne događa. To je zato što mu još niste rekli da učini nešto primjetno.
Predmeti u SQLAlhemiji
Sad kad su stvoreni vaši modeli, možete početi pristupiti objektima i čitati i pisati podatke. Dobra je ideja staviti svoju logiku u vlastiti razred i datoteku, ali za sada može ostati uz modele.
Pisanje podataka
U ovom primjeru trebate umetnuti neke podatke u bazu podataka prije nego što ih možete pročitati. Ako koristite postojeću bazu podataka, možda već imate podatke. Bilo kako bilo, vrlo je korisno znati umetati podatke.
Možda ste navikli pisati UMETNUTI izjave u SQL-u. SQLAlchemy to rješava umjesto vas. Evo kako umetnuti jedan red u polje Automobili model. Započnite s novim uvozom za sessionmaker:
iz sqlalchemy.orm uvoznika session session
Ovo je potrebno za stvaranje sjednica i DBSession predmeti koji se koriste za čitanje i pisanje podataka:
DBSession = sessionmaker (bind = engine) sesija = DBSession ()
Sada stavite ovo ispod vašeg create_all izjava:
car1 = Automobili (make = "Ford", boja = "srebrna") session.add (car1) session.commit ()
Raščlanimo taj kod. Varijabla car1 je definiran kao objekt temeljen na Automobili model. Njegov izgled i boja postavljaju se kao parametri. Ovo je kao da kažeš “napravi mi auto, ali još ga nemoj pisati u bazu podataka”. Ovaj automobil postoji u memoriji, ali čeka da bude napisan.
Dodajte automobil u sesiju sa session.add, a zatim ga napišite u bazu sa session.commit.
Sada dodajmo vlasnika:
owner1 = CarOwners (ime = "Joe", age = "99", car_id = (car1.id)) session.add (owner1) session.commit ()
Ovaj je kôd gotovo identičan prethodnom umetku za Automobili model. Glavna razlika ovdje je ta car_id je strani ključ pa mu je potreban ID retka koji postoji u drugoj tablici. To se pristupa putem car1.id svojstvo.
Ne morate pitati bazu podataka ili vratiti bilo kakav ID, jer SQLAlchemy to rješava za vas (sve dok prvo unesete podatke).
Čitanje podataka
Nakon što upišete neke podatke, možete ih početi čitati natrag. Evo kako upiti Automobili i CarOwners tablice:
rezultat = session.query (Automobili) .all ()
To je tako jednostavno. Korištenjem pitanje metoda pronađena u sjednica, odredite model, a zatim upotrijebite svi metoda za dobivanje svih rezultata. Ako znate da će biti samo jedan rezultat, možete ih koristiti prvi metoda:
rezultat = session.query (Automobili) .first ()
Nakon što upitate model i pohranite vraćene rezultate u varijablu, podacima možete pristupiti putem objekta:
ispis (rezultat [0] .color)
Ovo ispisuje boju “srebro”, kako je taj zapis prvi red. Ako želite, možete prelaziti petljem nad objektom rezultata.
Kao što ste definirali odnos u svom modelu, moguće je pristupiti podacima u povezanim tablicama bez navođenja pridruživanja:
result = session.query (CarOwners) .all () print (rezultat [0] .name) print (rezultat [0] .car.color)
Ovo funkcionira jer vaš model sadrži detalje o vašoj strukturi tablice i automobil atribut je definiran kao veza s automobili stol.
Što se ne sviđa ORM-ovima?
Ovaj je udžbenik pokrivao samo temelje, ali nakon što ste ih već zaključili, možete preći na naprednije teme. Postoje neki potencijalni nedostaci ORM-ova:
- Morate napisati svoj model prije nego što se bilo koji upit može pokrenuti.
- To je još jedna nova sintaksa koju treba naučiti.
- Možda je previše složen za jednostavne potrebe.
- Za početak morate imati dobar dizajn baze podataka.
Ovi problemi sami po sebi nisu veliki problem, ali na njih treba paziti. Ako radite s postojećom bazom podataka, možda ćete biti uhvaćeni.
Ako niste uvjereni da je ORM pravi alat za vas, obavezno pročitajte o važnim SQL naredbama programeri bi trebali znati 13 najvažnijih SQL naredbi koji svaki programer treba znati 13 najvažnije SQL naredbe Bilo koji programer treba znati svaki veliki ili dinamičan web stranica koristi bazu podataka na neki način, a u kombinaciji sa strukturiranim jezikom upita (SQL) mogućnosti manipuliranja podacima zaista su beskrajne. .