Vse, kar morate vedeti o Pythonu in objektno-relacijskih zemljevidih

Vse, kar morate vedeti o Pythonu in objektno-relacijskih zemljevidih

Morda ste že slišali za objektno-relacijsko preslikavo (ORM). Morda ste ga že uporabili, toda kaj točno so? In kako jih uporabljate v Pythonu?





Tukaj je vse, kar morate vedeti o ORM -jih in Pythonu.





Kaj je ORM?

Objektno-relacijsko preslikavanje (ORM) je tehnika programiranja, ki se uporablja za dostop do baze podatkov. Razkriva vašo zbirko podatkov v vrsti predmetov. Za vstavljanje ali pridobivanje podatkov vam ni treba pisati ukazov SQL, uporabite vrsto atributov in metod, povezanih s predmeti.





Morda se sliši zapleteno in nepotrebno, vendar vam lahko prihranijo veliko časa in pomagajo pri nadzoru dostopa do vaše baze podatkov.

Tukaj je primer. Recimo, da ga želite, ko geslo vstavite v bazo podatkov, zgostiti, kot je razloženo v zaščiti gesla za spletno mesto. To ni problem za preproste primere uporabe-izračun opravite pred vstavljanjem. Kaj pa, če morate zapis v kodo vstaviti na več mestih? Kaj pa, če v vašo mizo vstavi drug programer, za katerega pa vi ne veste?



Z uporabo ORM lahko zapišete kodo, da zagotovite, da se vedno, kjer koli in kjer koli dostopate do katere koli vrstice ali polja v zbirki podatkov, najprej izvede vaša druga koda po meri.

To deluje tudi kot „en sam vir resnice“. Če želite spremeniti izračun po meri, ga morate spremeniti samo na enem mestu, ne na več. Z mnogimi od teh načel je mogoče izvesti objektno usmerjeno programiranje (OOP) v Pythonu , vendar ORM delujejo skupaj z načeli OOP za nadzor dostopa do baze podatkov.





Pri uporabi ORM -a morate biti pozorni na nekatere stvari in obstajajo okoliščine, v katerih ga morda ne želite uporabiti, vendar se na splošno meni, da je to dobro, zlasti v veliki kodni bazi.

ORM v Pythonu z uporabo SQLAlchemy

Tako kot številna opravila v Pythonu je uvoz modula hitrejši in lažji od pisanja lastnega. Seveda je možno napisati svoj ORM, toda zakaj znova izumiti kolo?





Naslednji primeri vse uporabljajo SQLAlchemy , priljubljen Python ORM, vendar številna načela veljajo ne glede na izvedbo.

Nastavitev Pythona za SQLAlchemy

Preden takoj skočite, boste morali svoj stroj nastaviti za razvoj Pythona s SQLAlchemyjem.

Za spremljanje teh primerov boste morali uporabiti Python 3.6. Medtem ko bodo starejše različice delovale, bo spodnja koda pred začetkom delovanja potrebna nekaj sprememb. Niste prepričani o razlikah? Naša pogosta vprašanja o Pythonu pokrivajo vse razlike.

Pred kodiranjem morate nastaviti okolje Python, ki bo preprečilo težave z drugimi uvoženimi paketi Python.

Prepričajte se, da imate PIP, upravitelj paketov Python nameščen, ki prihaja z večino sodobnih različic Pythona.

Ko ste pripravljeni, lahko začnete s pripravo SQLAlchemyja. V svojem okolju Python v ukazni vrstici namestite SQLAlchemy z pip install ukaz:

pip install SQLAlchemy-1.2.9

The 1.2.9 je številka različice. Če želite dobiti najnovejši paket, lahko to pustite izključeno, vendar je dobro, da ste natančni. Ne veste, kdaj lahko nova izdaja prekine vašo trenutno kodo.

Zdaj ste pripravljeni na kodiranje. Morda boste morali pripraviti svojo bazo podatkov, da sprejme povezavo Python, vendar vsi naslednji primeri uporabljajo datoteko SQLite zbirka podatkov, ustvarjena v pomnilniku spodaj.

Modeli v SQLAlchemy

Ena ključnih sestavin ORM je a model . To je razred Python, ki opisuje, kako naj bi izgledala tabela in kako naj deluje. To je ORM različica Ustvari tabelo stavek v SQL. Za vsako tabelo v zbirki podatkov potrebujete model.

Odprite svoj najljubši urejevalnik besedil ali IDE in ustvarite novo datoteko z imenom test.py . Vnesite to zagonsko kodo, shranite datoteko in jo zaženite:

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

Ta koda naredi več stvari. Uvoz je potreben, da Python razume, kje najti module SQLAlchemy, ki jih potrebuje. Vaši modeli bodo uporabljali deklarativna_baza kasneje in konfigurira vse nove modele, da delujejo po pričakovanjih.

The create_engine method ustvari novo povezavo z vašo bazo podatkov. Če že imate bazo podatkov, jo boste morali spremeniti sqlite: // na URI baze podatkov. Ta koda bo ustvarila novo bazo podatkov samo v pomnilniku. Ko se koda dokonča, se zbirka podatkov uniči.

Končno, create_all method ustvari vse tabele, definirane v vaših načinih, v vaši zbirki podatkov. Ker še niste opredelili nobenega modela, se ne bo nič zgodilo. Pojdite naprej in zaženite to kodo, da zagotovite, da ne boste imeli težav ali tipkarskih napak.

Naredimo model. Na vrh datoteke dodajte še en uvoz:

from sqlalchemy import Column, Integer, String

To uvaža Stolpec , Celo število , in Vrvica moduli iz SQLAlchemy. Določajo, kako delujejo tabele baze podatkov, polja, stolpci in tipi podatkov.

Pod deklarativna_baza , ustvarite svoj modelni razred:

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

Ta preprost primer uporablja avtomobile, vendar lahko vaše tabele vsebujejo kakršne koli podatke.

Vsak razred mora podedovati Baza . Ime vaše tabele baze podatkov je definirano v __ime_tabele__ . To bi moralo biti enako imenu razreda, vendar je to le priporočilo in nič se ne bo zlomilo, če se ne ujemata.

Nazadnje je vsak stolpec definiran kot spremenljivka python v razredu. Uporabljajo se različne vrste podatkov in primarni_ključ atribut pove SQLAlchemyju, naj ustvari datoteko id stolpec kot primarni ključ.

Pojdite in dodajte še zadnji uvoz, tokrat za Tuji ključ modul. Dodajte to poleg svoje Stolpec uvoz:

from sqlalchemy import Column, ForeignKey, Integer, String

Zdaj ustvarite drugi razred modelov. Ta razred se imenuje Lastniki avtomobilov in shrani podatke o lastnikih določenih avtomobilov, shranjenih v Avtomobili miza:

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)

Tu je predstavljenih več novih lastnosti. The car_id polje je definirano kot tuji ključ. Povezan je z id v avtomobili miza. Upoštevajte, kako se uporablja ime male tabele, napisano z velikimi imeni razreda.

Za konec še atribut avto je opredeljen kot a odnos . To omogoča vašemu modelu dostop do Avtomobili tabelo skozi to spremenljivko. To je prikazano spodaj.

Če zdaj zaženete to kodo, boste videli, da se nič ne zgodi. To je zato, ker mu še niste rekli, naj naredi kaj opaznega.

Predmeti v SQLAlchemy

Zdaj, ko so vaši modeli ustvarjeni, lahko začnete dostopati do predmetov ter brati in pisati podatke. Dobro je, da svojo logiko postavite v svoj razred in datoteko, vendar za zdaj lahko ostane ob modelih.

Pisanje podatkov

V tem primeru morate v zbirko podatkov vnesti nekaj podatkov, preden jih lahko preberete. Če uporabljate obstoječo bazo podatkov, morda že imate podatke. Kakorkoli, še vedno je zelo koristno vedeti, kako vstaviti podatke.

Morda ste navajeni pisati VSTAVI stavki v SQL. SQLAlchemy to obravnava namesto vas. Takole vstavite eno vrstico v Avtomobili model. Začnite z novim uvozom za oblikovalec sej :

from sqlalchemy.orm import sessionmaker

To je potrebno za ustvarjanje sejo in DBS seja predmeti, ki se uporabljajo za branje in pisanje podatkov:

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

Zdaj to postavite pod svojo create_all izjava:

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

Razčlenimo to kodo. Spremenljivka avto1 je definiran kot objekt, ki temelji na Avtomobili model. Njegova znamka in barva sta nastavljena kot parametra. To je tako, kot bi rekel 'naredi mi avto, vendar ga še ne zapiši v bazo podatkov'. Ta avto obstaja v spominu, vendar čaka na zapis.

Avto seji dodajte z session.add , nato pa ga z bazo zapišite v bazo podatkov session.commit .

Zdaj pa dodajmo lastnika:

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

Ta koda je skoraj enaka prejšnjemu vstavku za Avtomobili model. Glavna razlika tukaj je v tem car_id je tuji ključ, zato potrebuje ID vrstice, ki obstaja v drugi tabeli. Do tega dostopate prek car1.id lastnine.

Ni vam treba poizvedovati po zbirki podatkov ali vrniti nobenih ID -jev, saj SQLAlchemy to obravnava namesto vas (dokler najprej posredujete podatke).

Branje podatkov

Ko napišete nekaj podatkov, jih lahko začnete brati nazaj. Evo, kako poizvedovati po Avtomobili in Lastniki avtomobilov tabele:

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

Tako preprosto je. Z uporabo poizvedba metodo, ki jo najdemo v sejo , določite model in nato uporabite vse metoda za pridobivanje vseh rezultatov. Če veste, da bo rezultat le en, lahko uporabite prvi metoda:

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

Ko poizvedujete o modelu in shranite vrnjene rezultate v spremenljivko, lahko do objekta dostopate prek predmeta:

print(result[0].color)

To natisne barvo 'srebrna', saj je ta zapis prva vrstica. Če želite, lahko prečkate rezultatni predmet.

Kot ste določili razmerje v svojem modelu, je možno dostopati do podatkov v sorodnih tabelah, ne da bi podali povezavo:

result = session.query(CarOwners).all()
print(result[0].name)
print(result[0].car.color)

To deluje, ker vaš model vsebuje podrobnosti o strukturi vaše tabele in avto atribut je bil opredeljen kot povezava do avtomobili miza.

Kaj ni všeč pri ORM -jih?

Ta vadnica je zajela samo osnove, ko pa se jih naučite, lahko nadaljujete z naprednimi temami. ORM ima nekaj možnih pomanjkljivosti:

  • Preden lahko izvedete kakršne koli poizvedbe, morate napisati svoj model.
  • To je še ena nova sintaksa za učenje.
  • Morda je preveč zapleteno za preproste potrebe.
  • Za začetek morate imeti dobro zasnovo baze podatkov.

Ta vprašanja sama po sebi niso velik problem, vendar so nanje pozorni. Če delate z obstoječo zbirko podatkov, vas lahko ujamejo.

Če niste prepričani, da je ORM pravo orodje za vas, preberite o pomembne ukaze SQL bi morali programerji poznati .

Deliti Deliti Cvrkutati E-naslov Ali morate takoj nadgraditi na Windows 11?

Windows 11 prihaja kmalu, vendar bi morali čim prej posodobiti ali počakati nekaj tednov? Pa ugotovimo.

Preberite Naprej
Sorodne teme
  • Programiranje
  • Python
  • SQL
  • Vadnice za kodiranje
O avtorju Joe Coburn(136 objavljenih člankov)

Joe je diplomiral iz računalništva na Univerzi v Lincolnu v Veliki Britaniji. Je poklicni razvijalec programske opreme in ko ne leti z brezpilotnimi letali ali ne piše glasbe, ga pogosto najdejo pri fotografiranju ali ustvarjanju videoposnetkov.

igro za igranje, ko vam je dolgčas na spletu
Več od Joea Coburna

Naročite se na naše novice

Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e -knjige in ekskluzivne ponudbe!

Kliknite tukaj, če se želite naročiti