Viskas, ką reikia žinoti apie „Python“ ir objektų santykių žemėlapius

Viskas, ką reikia žinoti apie „Python“ ir objektų santykių žemėlapius

Galbūt girdėjote apie objektų santykių žemėlapius (ORM). Galbūt jūs netgi naudojote vieną, bet kas jie yra? Ir kaip jūs juos naudojate „Python“?





Čia yra viskas, ką reikia žinoti apie ORM ir „Python“.





Kas yra ORM?

Objektų santykių kartografavimas (ORM) yra programavimo technika, naudojama prieigai prie duomenų bazės. Tai atskleidžia jūsų duomenų bazę į objektų seriją. Norėdami įterpti ar gauti duomenis, jums nereikia rašyti SQL komandų, naudojate atributų ir metodų, pridedamų prie objektų, seriją.



Tai gali atrodyti sudėtinga ir nereikalinga, tačiau jie gali sutaupyti daug laiko ir padėti kontroliuoti prieigą prie jūsų duomenų bazės.

Štai pavyzdys. Pasakykite, kad įterpdami slaptažodį į savo duomenų bazę, norite jį maišyti, kaip paaiškinta svetainės slaptažodžio sauga. Tai nėra problema paprastiems naudojimo atvejams-prieš įterpdami apskaičiuokite. O kas, jei jums reikia įterpti įrašą daugelyje kodo vietų? Ką daryti, jei kitas programuotojas įterpia į jūsų lentelę ir jūs to nežinote?



Naudodami ORM, galite parašyti kodą, kad užtikrintumėte, jog bet kada ir bet kur, kur pasiekiama bet kuri duomenų bazės eilutė ar laukas, pirmiausia bus įvykdytas kitas jūsų pasirinktinis kodas.

Tai taip pat veikia kaip „vienintelis tiesos šaltinis“. Jei norite pakeisti pasirinktinį skaičiavimą, turite jį pakeisti tik vienoje vietoje, o ne keliose. Galima įgyvendinti daugelį šių principų į objektą orientuotas programavimas (OOP) „Python“ , tačiau ORM veikia kartu su OOP principais, kad kontroliuotų prieigą prie duomenų bazės.





Yra tam tikrų dalykų, į kuriuos reikia atkreipti dėmesį naudojant ORM, ir yra aplinkybių, kai nenorite jo naudoti, tačiau paprastai jie laikomi gerais dalykais, ypač didelėje kodų bazėje.

ORM „Python“ naudojant „SQLAlchemy“

Kaip ir daugelis „Python“ užduočių, modulį importuoti greičiau ir lengviau nei rašyti savo. Žinoma, galima parašyti savo ORM, bet kodėl išradinėti ratą?





Toliau pateikiami visi pavyzdžiai SQLAlchemija , populiarus „Python ORM“, tačiau daugelis principų galioja nepriklausomai nuo diegimo.

„Python“ nustatymas „SQLAlchemy“

Prieš šokdami tiesiai, turėsite sukonfigūruoti savo mašiną „Python“ kūrimui naudodami „SQLAlchemy“.

Norėdami sekti šiuos pavyzdžius, turėsite naudoti „Python 3.6“. Nors senesnės versijos veiks, toliau pateiktą kodą reikės šiek tiek pakeisti, kol jis bus paleistas. Nesate tikri dėl skirtumų? Mūsų Python DUK apima visus skirtumus.

Prieš kodavimą turėtumėte nustatyti „Python“ aplinką, kuri padės išvengti problemų su kitais importuotais „Python“ paketais.

Įsitikinkite, kad turite PIP, „Python“ paketų tvarkyklė įdiegta, kuri yra su moderniausiomis „Python“ versijomis.

Kai būsite pasiruošę eiti, galite pradėti pasiruošę „SQLAlchemy“. Iš „Python“ aplinkos komandų eilutėje įdiekite „SQLAlchemy“ su pip įdiegti komanda:

pip install SQLAlchemy-1.2.9

The 1.2.9 yra versijos numeris. Galite atsisakyti, kad gautumėte naujausią paketą, tačiau gera praktika yra konkretus. Nežinote, kada naujas leidimas gali sugadinti dabartinį kodą.

Dabar esate pasiruošę pradėti koduoti. Jums gali tekti paruošti savo duomenų bazę, kad būtų priimtas „Python“ ryšys, tačiau visi šie pavyzdžiai naudoja SQLite duomenų bazė sukurta atmintyje žemiau.

SQLAlchemy modeliai

Vienas iš pagrindinių ORM komponentų yra a modelis . Tai „Python“ klasė, kurioje aprašoma, kaip turėtų atrodyti lentelė ir kaip ji turėtų veikti. Tai yra ORM versija KURTI LENTELĘ teiginys SQL. Jums reikia kiekvienos duomenų bazės lentelės modelio.

Atidarykite mėgstamą teksto rengyklę arba IDE ir sukurkite naują failą pavadinimu test.py . Įveskite šį pradžios kodą, išsaugokite failą ir paleiskite:

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

Šis kodas atlieka keletą dalykų. Importavimas yra būtinas, kad „Python“ suprastų, kur rasti jam reikalingų „SQLAlchemy“ modulių. Jūsų modeliai naudos deklaratyvinė_bazė vėliau, ir jis sukonfigūruos visus naujus modelius, kad jie veiktų taip, kaip tikėtasi.

The sukurti_variklį metodas sukuria naują ryšį su jūsų duomenų baze. Jei jau turite duomenų bazę, turėsite pakeisti sqlite: // į savo duomenų bazės URI. Šis kodas sukurs naują duomenų bazę tik atmintyje. Baigus vykdyti kodą, duomenų bazė sunaikinama.

Galiausiai, create_all metodas sukuria visas jūsų režimais nustatytas lenteles jūsų duomenų bazėje. Kadangi dar nenustatėte jokių modelių, nieko neatsitiks. Eikite į priekį ir paleiskite šį kodą, kad įsitikintumėte, jog neturite jokių problemų ar rašybos klaidų.

Padarykime modelį. Failo viršuje pridėkite kitą importuojamą informaciją:

from sqlalchemy import Column, Integer, String

Tai importuoja Stulpelis , Sveikasis skaičius , ir Styginė moduliai iš „SQLAlchemy“. Jie apibrėžia, kaip veikia duomenų bazės lentelės, laukai, stulpeliai ir duomenų tipai.

Po deklaratyvinė_bazė , sukurkite savo modelio klasę:

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

Šiame paprastame pavyzdyje naudojami automobiliai, tačiau jūsų lentelėse gali būti bet kokių duomenų.

Kiekviena klasė turi paveldėti Bazė . Jūsų duomenų bazės lentelės pavadinimas yra apibrėžtas __tablename__ . Tai turėtų sutapti su klasės pavadinimu, tačiau tai tik rekomendacija ir niekas nesugadins, jei jie nesutaps.

Galiausiai kiekvienas stulpelis klasėje yra apibrėžiamas kaip kintamasis python. Naudojami skirtingi duomenų tipai ir pirminis_raktas atributas nurodo „SQLAlchemy“ sukurti id stulpelį kaip pagrindinį raktą.

Eikite į priekį ir pridėkite paskutinį importą, šį kartą Svetimas raktas modulis. Pridėkite tai kartu su savo Stulpelis importas:

from sqlalchemy import Column, ForeignKey, Integer, String

Dabar sukurkite antrą modelių klasę. Ši klasė vadinama Automobilių savininkai ir saugo informaciją apie savininką apie konkrečius automobilius, saugomus Automobiliai lentelė:

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)

Čia pristatomi keli nauji atributai. The car_id laukas apibrėžiamas kaip užsienio raktas. Jis yra susijęs su id viduje konors automobilių lentelę. Atkreipkite dėmesį, kaip naudojamas mažųjų raidžių lentelės pavadinimas, įterptas į didžiųjų raidžių klasės pavadinimą.

Galiausiai, atributas automobilis yra apibrėžiamas kaip a santykiai . Tai leidžia jūsų modeliui pasiekti Automobiliai lentelę per šį kintamąjį. Tai parodyta žemiau.

Jei paleisite šį kodą dabar, pamatysite, kad nieko nevyksta. Taip yra todėl, kad dar nepasakėte, kad tai padarytų ką nors pastebimo.

SQLAlchemy objektai

Dabar, kai jūsų modeliai yra sukurti, galite pradėti pasiekti objektus, skaityti ir rašyti duomenis. Gera idėja įdėti savo logiką į savo klasę ir failą, tačiau kol kas ji gali likti šalia modelių.

Duomenų rašymas

Šiame pavyzdyje turite į duomenų bazę įterpti tam tikrus duomenis, kad galėtumėte juos perskaityti. Jei naudojate esamą duomenų bazę, galbūt jau turite duomenų. Bet kokiu atveju, vis tiek labai naudinga žinoti, kaip įterpti duomenis.

Galite būti įpratę rašyti ĮDĖTI teiginiai SQL. „SQLAlchemy“ tai tvarko už jus. Štai kaip įterpti vieną eilutę į Automobiliai modelis. Pradėkite nuo naujo importavimo sesijų vedėjas :

from sqlalchemy.orm import sessionmaker

To reikia norint sukurti sesija ir DBSession objektai, naudojami duomenims skaityti ir rašyti:

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

Dabar padėkite tai po savo create_all teiginys:

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

Suskaidykime tą kodą. Kintamasis automobilis1 yra apibrėžiamas kaip objektas, pagrįstas Automobiliai modelis. Gamintojas ir spalva yra nustatyti kaip parametrai. Tai tarsi pasakymas „padaryk man automobilį, bet dar nerašyk jo į duomenų bazę“. Šis automobilis yra atmintyje, bet laukia, kol bus parašytas.

Pridėkite automobilį prie sesijos naudodami sesija.pridėti , tada įrašykite jį į duomenų bazę naudodami sesija.įsipareigoti .

Dabar pridėkime savininką:

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

Šis kodas yra beveik identiškas ankstesniam intarpui Automobiliai modelis. Pagrindinis skirtumas čia yra tas car_id yra užsienio raktas, todėl reikia eilutės ID, esančio kitoje lentelėje. Tai pasiekiama per automobilis1.id nuosavybė.

Jums nereikia užklausti duomenų bazės ar grąžinti jokių ID, nes „SQLAlchemy“ tai tvarko už jus (jei tik pirmiausia įvedate duomenis).

Duomenų skaitymas

Parašę kai kuriuos duomenis, galite pradėti juos skaityti atgal. Štai kaip pateikti užklausą Automobiliai ir Automobilių savininkai lentelės:

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

Tai taip paprasta. Naudojant užklausa metodas, rastas sesija , nurodote modelį, tada naudojate visi metodas gauti visus rezultatus. Jei žinote, kad bus tik vienas rezultatas, galite naudoti Pirmas metodas:

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

Užklausę modelį ir išsaugoję gautus rezultatus kintamajame, duomenis galėsite pasiekti per objektą:

print(result[0].color)

Spausdinama spalva „sidabrinė“, nes įrašas yra pirmoji eilutė. Jei norite, galite perkelti rezultato objektą.

Kai apibrėžėte santykį savo modelyje, galite pasiekti duomenis susijusiose lentelėse nenurodę sujungimo:

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

Tai veikia, nes jūsų modelyje yra išsami informacija apie jūsų lentelės struktūrą ir automobilis atributas buvo apibrėžtas kaip nuoroda į automobilių lentelę.

Kas nepatinka ORM?

Ši pamoka apėmė tik pačius pagrindus, tačiau, kai jau žinote, galite pereiti prie išplėstinių temų. Yra keletas galimų ORM trūkumų:

  • Kad galėtumėte vykdyti bet kokias užklausas, turite parašyti savo modelį.
  • Tai dar viena nauja sintaksė, kurią reikia išmokti.
  • Tai gali būti pernelyg sudėtinga paprastiems poreikiams.
  • Norėdami pradėti, turite turėti gerą duomenų bazės dizainą.

Šios problemos savaime nėra didelė problema, tačiau į jas reikia atkreipti dėmesį. Jei dirbate su esama duomenų baze, galite būti užklupti.

Jei nesate įsitikinę, kad ORM yra jums tinkamas įrankis, būtinai perskaitykite apie tai programuotojai turėtų žinoti svarbias SQL komandas .

Dalintis Dalintis „Tweet“ Paštu Ar turėtumėte nedelsdami atnaujinti į „Windows 11“?

Netrukus pasirodys „Windows 11“, bet ar turėtumėte atnaujinti kuo greičiau arba palaukti kelias savaites? Išsiaiškinkime.

Skaityti toliau
Susijusios temos
  • Programavimas
  • Python
  • SQL
  • Kodavimo pamokos
Apie autorių Joe Coburn(Paskelbti 136 straipsniai)

Joe yra baigęs informatikos studijas Linkolno universitete, JK. Jis yra profesionalus programinės įrangos kūrėjas, o kai neskraido bepiločiais orlaiviais ir nerašo muzikos, jį dažnai galima rasti fotografuojant ar kuriant vaizdo įrašus.

pigios vietos telefono ekranui pataisyti
Daugiau iš Joe Coburn

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!

Norėdami užsiprenumeruoti, spustelėkite čia