Sve što trebate znati o Pythonu i objektno-relacijskim kartama

Sve što trebate znati o Pythonu i objektno-relacijskim kartama

Možda ste čuli za objektno-relacijsko mapiranje (ORM). Možda ste čak koristili jedan, ali što su oni zapravo? I kako ih koristite u Pythonu?





Evo svega što trebate znati o ORM -ovima i Pythonu.





Što je ORM?

Objektno-relacijsko mapiranje (ORM) je tehnika programiranja koja se koristi za pristup bazi podataka. Izlaže vašu bazu podataka u niz objekata. Ne morate pisati SQL naredbe za umetanje ili dohvaćanje podataka, koristite niz atributa i metoda pridruž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 umetnete lozinku u svoju bazu podataka, želite je raspršiti, kao što je objašnjeno u Sigurnosti lozinke web stranice. To nije problem za jednostavne slučajeve korištenja --- izračunate prije umetanja. Ali što ako trebate unijeti zapis na mnogo mjesta u kôd? Što ako drugi programer umetne u vašu tablicu, a vi ne znate?



Korištenjem ORM -a možete napisati kôd kako biste osigurali da se svaki put i gdje god pristupi bilo kojem retku ili polju u vašoj bazi podataka prvi izvrši vaš drugi, prilagođeni kôd.

Ovo također djeluje kao 'jedinstveni izvor istine'. Ako želite promijeniti prilagođeni izračun, morate ga promijeniti samo na jednom mjestu, a ne na nekoliko. Moguće je izvesti mnoga od ovih načela objektno orijentirano programiranje (OOP) u Pythonu , ali ORM -ovi rade zajedno s OOP načelima za kontrolu pristupa bazi podataka.





Prilikom korištenja ORM -a morate paziti na neke stvari, a postoje okolnosti u kojima ga možda ne želite koristiti, ali općenito se smatra da je to dobro imati, posebno u velikoj bazi kodova.

ORM -ovi u Pythonu koristeći SQLAlchemy

Kao i mnogi zadaci u Pythonu, uvoz i unos modula brži je i lakši od pisanja vlastitog. Naravno, moguće je napisati vlastiti ORM, ali zašto ponovno izumiti kotač?





Svi sljedeći primjeri koriste SQLAlkemija , popularan Python ORM, ali mnogi se principi primjenjuju bez obzira na implementaciju.

Postavljanje Pythona za SQLAlchemy

Prije nego što uđete, morat ćete postaviti svoj stroj za razvoj Pythona sa SQLAlchemy.

Morat ćete koristiti Python 3.6 da biste slijedili ove primjere. Dok će starije verzije raditi, donji će kôd trebati izmijeniti prije nego što se pokrene. Niste sigurni u razlike? Naša Pitanja o Pythonu pokrivaju sve razlike.

Prije kodiranja trebate postaviti Python okruženje koje će spriječiti probleme s drugim uvezenim paketima Python.

Pobrinite se da imate PIP, upravitelj paketa Python instaliran, koji dolazi s većinom modernih verzija Pythona.

Kad budete spremni za početak, možete započeti s pripremom SQLAlchemyja. Iz svog Python okruženja u naredbenom retku instalirajte SQLAlchemy sa pip install naredba:

pip install SQLAlchemy-1.2.9

The 1.2.9 je broj verzije. Ovo možete ostaviti isključeno kako biste dobili najnoviji paket, ali dobra je praksa biti precizan. Ne znate kada bi novo izdanje moglo pokvariti vaš trenutni kôd.

Sada ste spremni za početak kodiranja. Možda ćete morati pripremiti bazu podataka za prihvaćanje Python veze, ali svi sljedeći primjeri koriste datoteku SQLite baza podataka stvorena u memoriji ispod.

Modeli u SQLAlchemiji

Jedna od ključnih komponenti ORM -a je a model . Ovo je Python klasa koja opisuje kako bi tablica trebala izgledati i kako bi trebala raditi. To je ORM verzija IZRADI TABLICU izraz u SQL -u. Za svaku tablicu u bazi podataka potreban vam je model.

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 declarative_base
Base = declarative_base()
engine = create_engine('sqlite://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

Ovaj kod čini nekoliko stvari. Uvoz je neophodan kako bi Python razumio gdje pronaći potrebne SQLAlchemy module. Vaši će modeli koristiti deklarativna_baza kasnije i konfigurira sve nove modele za rad prema očekivanjima.

The stvoriti_motor method 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 kada vaš kod završi s izvršavanjem.

Konačno, create_all method stvara sve tablice definirane u vašim načinima u vašoj bazi podataka. Kako još niste definirali nijedan model, ništa se neće dogoditi. Pokrenite ovaj kôd kako biste bili sigurni da nemate problema ili pravopisnih pogrešaka.

Napravimo model. Dodajte još jedan uvoz na vrh datoteke:

from sqlalchemy import Column, Integer, String

Time se uvozi Stupac , Cijeli broj , i Niz moduli iz SQLAlchemy. Oni definiraju kako tablice baze podataka, polja, stupci i tipovi podataka rade.

Ispod deklarativna_baza , stvorite svoju klasu modela:

class Cars(Base):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
make = Column(String(50), nullable=False)
color = Column(String(50), nullable=False)

Ovaj jednostavan primjer koristi automobile, ali vaše tablice mogu sadržavati bilo koje podatke.

Svaka klasa mora naslijediti Baza . Naziv tablice vaše baze podataka definiran je u __ime_tabele__ . To bi trebao biti isti naziv naziva, ali ovo je samo preporuka i ništa se neće slomiti ako se ne podudaraju.

Konačno, svaki stupac definiran je kao python varijabla unutar klase. Koriste se različiti tipovi podataka, a glavni ključ atribut govori SQLAlchemyju da stvori iskaznica stupac kao primarni ključ.

Samo naprijed i dodajte posljednji uvoz, ovaj put za Strani kljuc modul. Dodajte ovo uz svoje Stupac uvoz:

from sqlalchemy import Column, ForeignKey, Integer, String

Sada stvorite drugu klasu modela. Ova klasa se zove Vlasnici automobila , i pohranjuje podatke o vlasnicima određenih automobila pohranjenih u Automobili stol:

class CarOwners(Base):
__tablename__ = 'carowners'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
age = Column(Integer, nullable=False)
car_id = Column(Integer, ForeignKey('cars.id'))
car = relationship(Cars)

Ovdje je uvedeno nekoliko novih atributa. The car_id polje je definirano kao strani ključ. Povezan je s iskaznica u automobili stol. Obratite pažnju na to kako se koristi naziv male tablice, umjesto imena velike klase.

Konačno, atribut automobil definira se kao a odnos . To omogućuje vašem modelu pristup Automobili tablice kroz ovu varijablu. To je prikazano u nastavku.

Ako sada pokrenete ovaj kôd, vidjet ćete da se ništa neće dogoditi. To je zato što mu još niste rekli da učini bilo što uočljivo.

Objekti u SQLAlchemiji

Sada kada su vaši modeli stvoreni, možete pristupiti objektima i čitati i pisati podatke. Bilo bi dobro staviti svoju logiku u vlastitu klasu i datoteku, ali za sada može ostati uz modele.

Pisanje podataka

U ovom primjeru morate umetnuti neke podatke u bazu podataka da biste ih mogli pročitati. Ako koristite postojeću bazu podataka, možda već imate podatke. U svakom slučaju, još uvijek je vrlo korisno znati umetnuti podatke.

Možda ste navikli pisati UMETNUTI izrazi u SQL -u. SQLAlchemy to rješava umjesto vas. Evo kako umetnuti jedan red u Automobili model. Počnite s novim uvozom za voditelj sjednice :

from sqlalchemy.orm import sessionmaker

To je potrebno za stvaranje sjednica i DBS sjednica objekti koji se koriste za čitanje i pisanje podataka:

DBSession = sessionmaker(bind=engine)
session = DBSession()

Sada stavite ovo ispod svoje create_all izjava:

car1 = Cars(
make='Ford',
color='silver'
)
session.add(car1)
session.commit()

Razbijmo taj kôd. Varijabla automobil1 definira se kao objekt na temelju Automobili model. Njegova marka i boja postavljeni su kao parametri. Ovo je kao da kažete 'napravite mi auto, ali nemojte ga još upisivati ​​u bazu podataka'. Ovaj automobil postoji u memoriji, ali čeka na pisanje.

Dodajte automobil u sesiju pomoću sjednica.dodati , a zatim ga upišite u bazu podataka s sjednica.composlati .

Sada dodajmo vlasnika:

owner1 = CarOwners(
name='Joe',
age='99',
car_id=(car1.id)
)
session.add(owner1)
session.commit()

Ovaj je kod gotovo identičan prethodnom umetku za Automobili model. Glavna razlika ovdje je u tome car_id je strani ključ pa mu je potreban ID retka koji postoji u drugoj tablici. Tome se pristupa putem auto1.id imovine.

Ne morate postavljati upite u bazu podataka niti vraćati bilo koje ID -ove jer SQLAlchemy to rješava umjesto vas (sve dok prvo predate podatke).

Čitanje podataka

Nakon što ste napisali neke podatke, možete ih početi čitati natrag. Evo kako postaviti upit za Automobili i Vlasnici automobila tablice:

result = session.query(Cars).all()

To je tako jednostavno. Korištenjem upit metoda koja se nalazi u sjednica , određujete model, a zatim koristite svi metoda za dohvaćanje svih rezultata. Ako znate da će biti samo jedan rezultat, možete upotrijebiti prvi metoda:

result = session.query(Cars).first()

Nakon što ste postavili upit o modelu i pohranili vraćene rezultate u varijablu, podacima možete pristupiti putem objekta:

print(result[0].color)

Ovo ispisuje boju 'srebrna' jer je taj zapis prvi red. Ako želite, možete prelaziti preko objekta rezultata.

Kako 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(result[0].name)
print(result[0].car.color)

To funkcionira jer vaš model sadrži pojedinosti o strukturi tablice i automobil atribut definiran je kao veza na automobili stol.

Što se ne sviđa ORM -ovima?

Ovaj tutorial obuhvatio je samo osnove, ali kad ih naučite, možete prijeći na napredne teme. Postoje neki potencijalni nedostaci ORM -ova:

  • Morate napisati svoj model da biste mogli pokrenuti bilo kakve upite.
  • To je još jedna nova sintaksa za učenje.
  • Možda je previše složeno za jednostavne potrebe.
  • Za početak morate imati dobar dizajn baze podataka.

Ova pitanja sama 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, svakako pročitajte o važne SQL naredbe koje bi programeri trebali znati .

Udio Udio Cvrkut E -pošta Trebate li odmah nadograditi na Windows 11?

Windows 11 uskoro dolazi, no trebate li se ažurirati što je prije moguće ili pričekati nekoliko tjedana? Hajde da vidimo.

Pročitajte Dalje
Povezane teme
  • Programiranje
  • Piton
  • SQL
  • Vodiči za kodiranje
O autoru Joe Coburn(136 objavljenih članaka)

Joe je diplomirao računalne znanosti na Sveučilištu Lincoln, UK. On je profesionalni programer softvera, a kad ne leti bespilotnim letjelicama ili ne piše glazbu, često ga se može zateći kako fotografira ili proizvodi video zapise.

kako provjeriti je li veza sigurna
Više od Joea Coburna

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e -knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu