Alt du trenger å vite om Python og Object-Relational Maps

Alt du trenger å vite om Python og Object-Relational Maps / programmering

Du har kanskje hørt om objektrelasjonell kartlegging (ORM). Du har kanskje brukt en, men hva er de egentlig? Og hvordan bruker du dem i Python?

Her er alt du trenger å vite om ORMer og Python.

Hva er en ORM?

Objektrelasjonell kartlegging (ORM) er en programmeringsteknikk som brukes til å få tilgang til en database. Den avslører databasen din i en serie objekter. Du trenger ikke skrive SQL-kommandoer for å sette inn eller hente data, du bruker en rekke attributter og metoder knyttet til objekter.

Det kan hende at det er komplekst og unødvendig, men de kan spare deg for mye tid, og bidra til å kontrollere tilgangen til databasen.

Her er et eksempel. Si at når du setter inn et passord i databasen din, vil du ha det, som forklart i nettsidens passordsikkerhet. Hver sikker nettside gjør dette med passordet ditt Hver sikker nettside gjør dette med passordet Har du noen gang lurt på hvordan nettsteder holder passordet ditt trygt fra data brudd? Les mer . Dette er ikke et problem for enkel bruk tilfeller-du gjør beregningen før du setter inn. Men hva om du trenger å sette inn en plate mange steder i koden? Hva om en annen programmerer legger inn i bordet ditt, og du vet ikke om?

Ved å bruke en ORM, kan du skrive kode for å sikre at når og hvor og hvilken rad eller felt i databasen din er tilgjengelig, blir din andre, tilpassede kode kjørt først.

Dette fungerer også som en “enkeltkilden til sannhet”. Hvis du vil endre en tilpasset beregning, må du bare endre den på ett sted, ikke flere. Det er mulig å utføre mange av disse prinsippene med objektorientert programmering (OOP) i Python A Beginner's Guide til Python Object Oriented Programmering En nybegynners guide til Python Object Oriented Programmering For å dra full nytte av Pythons styrker, vil du lære hvordan Python arbeider med objektorientert programmering (OOP). Les mer, men ORMs fungerer sammen med OOP-prinsipper for å kontrollere tilgang til en database.

Det er visse ting å passe på når du bruker en ORM, og det er omstendigheter der du kanskje ikke vil bruke en, men de anses generelt for å være en god ting å ha, spesielt i en stor kodebase.

ORMer i Python ved hjelp av SQLAlchemy

Som mange oppgaver i Python, er det raskere og enklere å importere en modul enn å skrive egen. Selvfølgelig er det mulig å skrive din egen ORM, men hvorfor gjenoppfinne hjulet?

Følgende eksempler bruker alle SQLAlchemy, et populært Python ORM, men mange av prinsippene gjelder uavhengig av implementeringen.

Sette opp Python for SQLAlchemy

Før du hopper rett inn, må du sette opp maskinen din for Python-utvikling med SQLAlchemy.

Du må bruke Python 3.6 for å følge med disse eksemplene. Mens eldre versjoner vil fungere, vil koden nedenfor trenge noen modifikasjoner før den kjører. Ikke sikker på forskjellene? Våre Python FAQ De vanligste spørsmål om Python Programmering De vanligste spørsmål om Python Programmering I denne artikkelen vil vi gå gjennom alt du trenger å vite om Python som nybegynner. Les mer dekker alle forskjellene.

Før du skal kodes, bør du sette opp et Python-miljø. Lær hvordan du bruker Python Virtual Environment Lær hvordan du bruker Python Virtual Environment Uansett om du er en erfaren Python-utvikler, eller du bare har begynt, er det viktig å lære å sette opp et virtuelt miljø. for ethvert Python-prosjekt. Les mer, som forhindrer problemer med andre importerte Python-pakker.

Pass på at du har PIP, Python-pakkebehandleren. Slik installerer du PIP for Python på Windows, Mac og Linux. Slik installerer du PIP for Python på Windows, Mac og Linux. Mange Python-utviklere stole på et verktøy som heter PIP for Python for å gjøre alt mye enklere og raskere. Slik installerer du PIP. Les Mer installert, som følger med de fleste moderne versjoner av Python.

Når du er klar til å gå, kan du begynne å få SQLAlchemy klar. Fra ditt Python-miljø i kommandolinjen, installer SQLAlchemy med pip installasjon kommando:

pip installere SQLAlchemy-1.2.9

De 1.2.9 er versjonsnummeret. Du kan forlate dette for å få den siste pakken, men det er god praksis å være spesifikk. Du vet ikke når en ny versjon kan bryte din nåværende kode.

Nå er du klar til å starte kodingen. Du må kanskje forberede databasen din for å godta en Python-tilkobling, men følgende eksempler bruker alle en SQLite-database opprettet i minnet under.

Modeller i SQLAlchemy

En av nøkkelkomponentene i en ORM er a modell. Dette er en Python-klasse som beskriver hva et bord skal se ut, og hvordan det skal fungere. Det er ORM-versjonen av CREATE TABLE setning i SQL. Du trenger en modell for hvert bord i databasen.

Åpne din favoritt tekstredigerer eller IDE, og opprett en ny fil som heter test.py. Skriv inn denne startkoden, lagre filen og kjør den:

fra sqlalchemy import create_engine fra sqlalchemy.ext.declarative import declarative_base Base = declarative_base () engine = create_engine ('sqlite: //') # Lag databasen i minnet Base.metadata.create_all (motor) # Opprett alle tabellene i databasen 

Denne koden gjør flere ting. Importen er nødvendig slik at Python forstår hvor de skal finne SQLAlchemy-modulene den trenger. Modellene dine vil bruke declarative_base senere, og det konfigurerer nye modeller for å fungere som forventet.

De create_engine Metoden skaper en ny tilkobling til databasen. Hvis du allerede har en database, må du endre SQLite: // til databasen URI. Som det er, vil denne koden bare opprette en ny database i minnet. Databasen blir ødelagt når koden din er ferdig.

Endelig, den create_all Metoden lager alle tabellene som er definert i modiene i databasen. Som du ikke har definert noen modeller ennå, skjer ingenting. Gå videre og kjør denne koden, for å sikre at du ikke har noen problemer eller skrivefeil.

La oss lage en modell. Legg til en annen import øverst på filen din:

fra sqlalchemy import kolonne, helhet, streng

Dette importerer Kolonne, Integer, og string moduler fra SQLAlchemy. De definerer hvordan databasetabeller, felt, kolonner og datatyper fungerer.

Under declarative_base, lag din modell klasse:

Klassebiler (Base): __tablename__ = 'biler' id = Kolonne (Integer, primary_key = True) make = Kolonne (String (50), nullbar = False) Farge = Kolonne (String (50), nullbar = False)

Dette enkle eksempelet bruker biler, men tabellene dine kan inneholde data.

Hver klasse må arve Utgangspunkt. Datatabellnavnet ditt er definert i __tablename__. Dette bør være det samme som klassenavnet, men dette er bare en anbefaling, og ingenting vil bryte hvis de ikke stemmer overens.

Endelig defineres hver kolonne som en pythonvariabel innenfor klassen. Ulike datatyper brukes, og primærnøkkel attributt forteller SQLAlchemy å opprette id kolonne som en primærnøkkel.

Gå videre og legg til en siste import, denne gangen for fremmednøkkel modul. Legg til dette ved siden av din Kolonne importere:

fra sqlalchemy import kolonne, foreignkey, helhet, streng

Opprett nå en andre modellklasse. Denne klassen kalles CarOwners, og lagrer eierdetaljer av bestemte biler lagret i Biler bord:

Klasse CarOwners (Base): __tablename__ = 'Carowners' id = Kolonne (Integer, primary_key = True) Name = Kolonne (String (50), nullerbar = False) alder = Kolonne (Integer, nullerlig = False) car_id = Kolonne ForeignKey ('cars.id')) bil = forhold (biler)

Det er innført flere nye attributter her. De car_id feltet er definert som en fremmednøkkel. Det er knyttet til id i biler bord. Legg merke til hvordan navnet på små bokstaver brukes, innstilt på store bokstavsnavn.

Endelig en attributt av bil er definert som a forhold. Dette tillater at modellen din får tilgang til Biler Tabell gjennom denne variabelen. Dette er vist nedenfor.

Hvis du kjører denne koden nå, ser du at ingenting skjer. Dette er fordi du ikke har fortalt det å gjøre noe merkbart ennå.

Objekter i SQLAlchemy

Nå som modellene dine er opprettet, kan du begynne å få tilgang til objektene, og lese og skrive data. Det er en god idé å plassere logikken i sin egen klasse og fil, men for nå kan den forbli ved siden av modellene.

Skrive data

I dette eksemplet må du sette inn noen data i databasen før du kan lese den. Hvis du bruker en eksisterende database, kan du ha data allerede. Uansett er det fortsatt veldig nyttig å vite hvordan du setter inn data.

Du kan være vant til å skrive SETT INN uttalelser i SQL. SQLAlchemy håndterer dette for deg. Slik setter du inn en rad i Biler modell. Start med en ny import for sessionmaker:

fra sqlalchemy.orm import sessionmaker

Dette er nødvendig for å opprette økt og DBSession objekter som brukes til å lese og skrive data:

DBSession = sessionmaker (bind = motor) økt = DBSession ()

Legg nå dette under din create_all uttalelse:

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

La oss slå ned den koden. Variabelen akkumulatorer1 er definert som et objekt basert på Biler modell. Dens merke og farge er satt som parametere. Dette er som å si “gi meg en bil, men ikke skriv den til databasen ennå”. Denne bilen finnes i minnet, men venter på å bli skrevet.

Legg bilen til økten med session.add, og skriv det til databasen med session.commit.

La oss nå legge til en eier:

owner1 = CarOwners (navn = "Joe", alder = "99", car_id = (car1.id)) session.add (owner1) session.commit ()

Denne koden er nesten identisk med forrige innsats for Biler modell. Hovedforskjellen her er det car_id er en fremmed nøkkel, så trenger en rad-id som finnes i den andre tabellen. Dette er tilgjengelig gjennom car1.id eiendom.

Du trenger ikke å spørre databasen eller returnere noen ids, ettersom SQLAlchemy håndterer dette for deg (så lenge du forplikter dataene først).

Lese data

Når du har skrevet noen data, kan du begynne å lese den tilbake. Slik spør du om Biler og CarOwners tabeller:

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

Det er så enkelt. Ved å bruke spørsmål metode funnet i økt, Du spesifiserer modellen, og bruk deretter alle metode for å hente alle resultatene. Hvis du vet, vil det bare være ett resultat, så kan du bruke først metode:

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

Når du har bedt om modellen, og lagret de returnerte resultatene i en variabel, kan du få tilgang til dataene gjennom objektet:

print (resultat [0] Color)

Dette skriver ut fargen “sølv”, som posten er den første raden. Du kan sløyfe over resultatobjektet hvis du vil.

Når du har definert forholdet i modellen din, er det mulig å få tilgang til data i relaterte tabeller uten å spesifisere en tilmelding:

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

Dette fungerer fordi modellen inneholder detaljer om tabellstrukturen din og bil Attributtet ble definert som en lenke til biler bord.

Hva er ikke å like om ORMer?

Denne opplæringen dekket bare de aller grunnleggende, men når du har fått tak i dem, kan du flytte på avanserte emner. Det er noen mulige ulemper for ORMer:

  • Du må skrive modellen før noen spørsmål kan kjøre.
  • Det er en annen ny syntaks å lære.
  • Det kan være for komplisert for enkle behov.
  • Du må ha en god database design til å begynne med.

Disse problemene er ikke et stort problem alene, men de er ting å passe på. Hvis du jobber med en eksisterende database, kan du bli fanget ut.

Hvis du ikke er overbevist om at en ORM er det riktige verktøyet for deg, så sørg for at du leser om de viktige SQL-kommandoene som programmører burde vite. 13 Viktigste SQL-kommandoer Enhver programmerer bør vite 13 Viktigste SQL-kommandoer Enhver programmerer bør vite hver stor eller dynamisk Nettstedet bruker en database på noen måte, og når kombinert med Structured Query Language (SQL), er mulighetene for å manipulere data virkelig endeløse. Les mer .

Utforsk mer om: Kodingstutorials, Python, SQL.