
Brian Curtis
0
1941
117
Du har muligvis hørt om objekt-relationel kortlægning (ORM). Du har måske endda brugt en, men hvad er de nøjagtigt? Og hvordan bruger du dem i Python?
Her er alt hvad du har brug for at vide om ORM'er og Python.
Hvad er en ORM?
Object-relationel mapping (ORM) er en programmeringsteknik, der bruges til at få adgang til en database. Det udsætter din database for en række objekter. Du behøver ikke at skrive SQL-kommandoer for at indsætte eller hente data, du bruger en række attributter og metoder knyttet til objekter.
Det lyder muligvis komplekst og unødvendigt, men de kan spare dig for meget tid og hjælpe med at kontrollere adgangen til din database.
Her er et eksempel. Sig, at hver gang du indsætter en adgangskode i din database, vil du hash den, som forklaret i websteds adgangskodesikkerhed. Hvert sikkert websted gør dette med din adgangskode Hvert sikkert websted gør dette med din adgangskode. Har du nogensinde spekuleret på, hvordan websteder holder dit kodeord sikkert fra data brud? . Dette er ikke et problem i tilfælde af simpel brug - du foretager beregningen, før du indsætter. Men hvad nu hvis du har brug for at indsætte en post mange steder i koden? Hvad hvis en anden programmør indsætter i dit bord, og du ikke ved noget om det?
Ved at bruge en ORM kan du skrive kode for at sikre, at når og hvor som helst række eller felt i din database åbnes, udføres din anden tilpassede kode først.
Dette fungerer også som en “enkelt kilde til sandhed”. Hvis du vil ændre en brugerdefineret beregning, skal du kun ændre den ét sted, ikke flere. Det er muligt at udføre mange af disse principper med objektorienteret programmering (OOP) i Python A Beginners vejledning til Python objektorienteret programmering En begynderguide til Python objektorienteret programmering For at drage fuld fordel af Pythons styrker, ønsker du at lære, hvordan Python arbejder med objektorienteret programmering (OOP). , men ORM'er arbejder i takt med OOP-principper for at kontrollere adgangen til en database.
Der er visse ting, man skal være opmærksom på, når man bruger en ORM, og der er omstændigheder, hvor man måske ikke ønsker at bruge en, men de anses generelt for at være en god ting at have, især i en stor codebase.
ORM'er i Python ved hjælp af SQLAlchemy
Som mange opgaver i Python er det hurtigere og lettere at importere et modul end at skrive dit eget. Selvfølgelig er det muligt at skrive din egen ORM, men hvorfor genfinde hjulet igen?
De følgende eksempler bruger alle SQLAlchemy, en populær Python ORM, men mange af principperne gælder uanset implementeringen.
Opsætning af Python til SQLAlchemy
Før du hopper lige ind, skal du konfigurere din maskine til Python-udvikling med SQLAlchemy.
Du skal bruge Python 3.6 for at følge disse eksempler. Mens ældre versioner fungerer, skal koden herunder ændres, før den kører. Ikke sikker på forskellene? Vores ofte stillede spørgsmål om Python De mest ofte stillede spørgsmål om Python-programmering De mest ofte stillede spørgsmål om Python-programmering I denne artikel vil vi lede dig gennem alt, hvad du har brug for at vide om Python som nybegynder. dækker alle forskelle.
Før kodning skal du oprette et Python-miljø Lær hvordan man bruger det virtuelle Python-miljø Lær hvordan man bruger det virtuelle Python-miljø Uanset om du er en erfaren Python-udvikler, eller du lige er i gang, er det vigtigt at lære at konfigurere et virtuelt miljø til ethvert Python-projekt. , hvilket forhindrer problemer med andre importerede Python-pakker.
Sørg for, at du har PIP, Python-pakkeadministratoren Sådan installeres Python PIP på Windows, Mac og Linux Sådan installeres Python PIP på Windows, Mac og Linux Mange Python-udviklere er afhængige af et værktøj kaldet PIP for Python for at gøre alt lettere og mere hurtigere. Sådan installeres Python PIP. installeret, som kommer med de fleste moderne versioner af Python.
Når du er klar til at gå, kan du begynde med at gøre SQLAlchemy klar. Fra dit Python-miljø på kommandolinjen skal du installere SQLAlchemy med pip installere kommando:
pip installere SQLAlchemy-1.2.9
Det 1.2.9 er versionnummeret. Du kan forlade dette for at få den nyeste pakke, men det er god praksis at være specifik. Du ved ikke, hvornår en ny udgivelse kan ødelægge din nuværende kode.
Nu er du klar til at starte kodning. Det kan være nødvendigt at forberede din database til at acceptere en Python-forbindelse, men de følgende eksempler bruger alle en SQLite-database oprettet i hukommelsen nedenfor.
Modeller i SQLAlchemy
En af nøglekomponenterne i en ORM er en model. Dette er en Python-klasse, der skitserer, hvordan en tabel skal se ud, og hvordan den skal fungere. Det er ORM-versionen af Opret TABEL erklæring i SQL. Du har brug for en model til hver tabel i din database.
Åbn din favorit teksteditor eller IDE, og opret en ny fil kaldet test.py. Indtast denne startkode, gem filen, og kør den:
fra sqlalchemy import create_engine fra sqlalchemy.ext.declarative import declarative_base Base = declarative_base () engine = create_engine ('sqlite: //') # Opret databasen i hukommelsen Base.metadata.create_all (engine) # Opret alle tabeller i databasen
Denne kode gør flere ting. Importen er nødvendig, så Python forstår, hvor de SQLAlchemy-moduler, den har brug for, findes. Dine modeller bruger declarative_base senere, og det konfigurerer alle nye modeller til at fungere som forventet.
Det create_engine metoden opretter en ny forbindelse til din database. Hvis du allerede har en database, skal du ændre sqlite: // til din database URI. Som det er, vil denne kode kun oprette en ny database i hukommelsen. Databasen ødelægges, når din kode er afsluttet.
Endelig create_all metoden opretter alle de tabeller, der er defineret i dine tilstande i din database. Da du endnu ikke har defineret nogen modeller, vil der ikke ske noget. Gå videre og kør denne kode for at sikre, at du ikke har problemer eller skrivefejl.
Lad os lave en model. Tilføj en ny import øverst i din fil:
fra sqlalchemy import kolonne, heltal, streng
Dette importerer Kolonne, Heltal, og Snor moduler fra SQLAlchemy. De definerer, hvordan databasetabeller, felter, kolonner og datatyper fungerer.
Under declarative_base, opret din modelklasse:
klasse Biler (base): __tablename__ = 'cars' id = kolonne (heltal, primær_nøgle = sandt) fabrikat = kolonne (streng (50), nullable = falsk) farve = kolonne (streng (50), nullable = falsk)
Dette enkle eksempel bruger biler, men dine tabeller kan indeholde data.
Hver klasse skal arve Base. Dit databasetabelnavn er defineret i __tablename__. Dette skal være det samme som klassens navn, men dette er bare en anbefaling, og intet vil gå i stykker, hvis de ikke stemmer overens.
Endelig er hver søjle defineret som en pythonvariabel i klassen. Forskellige datatyper bruges, og primærnøgle attribut fortæller SQLAlchemy at oprette id kolonne som en primær nøgle.
Gå videre og tilføj en sidste import, denne gang for Fremmed nøgle modul. Tilføj dette ved siden af din Kolonne importere:
fra sqlalchemy-importkolonne, ForeignKey, Heeltal, String
Opret nu en anden modelklasse. Denne klasse kaldes CarOwners, og gemmer ejeroplysninger om specifikke biler, der er gemt i biler bord:
klasse CarOwners (Base): __tablename__ = 'carowners' id = Kolonne (heltal, primær_nøgle = sandt) navn = kolonne (streng (50), nullable = falsk) alder = kolonne (heltal, nullable = falsk) car_id = kolonne (heltal, heltal, ForeignKey ('cars.id')) bil = forhold (biler)
Der er flere nye attributter introduceret her. Det car_id felt er defineret som en fremmed nøgle. Det er knyttet til id i biler bord. Bemærk, hvordan navnet på små bogstaver bruges, indsat navn på store bogstaver.
Endelig en attribut af bil er defineret som en forhold. Dette giver din model adgang til biler tabel gennem denne variabel. Dette demonstreres nedenfor.
Hvis du kører denne kode nu, vil du se, at der ikke sker noget. Dette er fordi du ikke har bedt det om at gøre noget mærkbart endnu.
Objekter i SQLAlchemy
Nu, hvor dine modeller er oprettet, kan du begynde at få adgang til objekterne og læse og skrive data. Det er en god ide at placere din logik i sin egen klasse og fil, men indtil videre kan den forblive sammen med modellerne.
Skrivning af data
I dette eksempel skal du indsætte nogle data i databasen, før du kan læse dem. Hvis du bruger en eksisterende database, har du muligvis allerede data. Uanset hvad, er det stadig meget nyttigt at vide, hvordan man indsætter data.
Du er måske vant til at skrive INSERT udsagn i SQL. SQLAlchemy håndterer dette for dig. Sådan indsættes en række i biler model. Start med en ny import til sessionmaker:
fra sqlalchemy.orm import sessionmaker
Dette er nødvendigt for at oprette session og DBSession objekter, der bruges til at læse og skrive data:
DBSession = sessionmaker (bind = motor) session = DBSession ()
Læg dette nu under din create_all udmelding:
car1 = Cars (fabrikat = "Ford", farve = "silver") session.add (car1) session.commit ()
Lad os fordele den kode. Variablen CAR1 er defineret som et objekt baseret på biler model. Dets mærke og farve indstilles som parametre. Dette er som at sige “Lav mig en bil, men skriv den ikke til databasen endnu”. Denne bil findes i hukommelsen, men venter på at blive skrevet.
Føj bilen til sessionen med session.add, og skriv det derefter til databasen med session.commit.
Lad os nu tilføje en ejer:
ejer1 = CarOwners (navn = "Joe", alder = "99", car_id = (car1.id)) session.add (ejer1) session.commit ()
Denne kode er næsten identisk med den forrige indsætning for biler model. Den største forskel her er det car_id er en fremmed nøgle, så har brug for en række-id, der findes i den anden tabel. Dette tilgås via car1.id ejendom.
Du behøver ikke at forespørge databasen eller returnere nogen id'er, da SQLAlchemy håndterer dette for dig (så længe du overfører dataene først).
Læsning af data
Når du har skrevet nogle data, kan du begynde at læse dem tilbage. Her er, hvordan du spørger om biler og CarOwners tabeller:
result = session.query (Cars) .all ()
Så enkelt er det. Ved at bruge forespørgsel metode fundet i session, du specificerer modellen og derefter bruge alle metode til at hente alle resultater. Hvis du ved, at der kun vil være et resultat, kan du bruge først metode:
result = session.query (Cars) .first ()
Når du har forespurgt modellen og gemt dine returnerede resultater i en variabel, kan du få adgang til dataene gennem objektet:
print (resultat [0] .color)
Dette udskriver farven “sølv”, da denne rekord er den første række. Du kan sløjfe over resultatobjektet, hvis du vil.
Når du definerede forholdet i din model, er det muligt at få adgang til data i relaterede tabeller uden at specificere en sammenføjning:
result = session.query (CarOwners) .all () print (result [0] .name) print (result [0] .car.color)
Dette fungerer, fordi din model indeholder detaljer om din tabelstruktur og bil attribut blev defineret som et link til biler bord.
Hvad kan du ikke lide ved ORM'er?
Denne tutorial dækkede kun de grundlæggende elementer, men når du først har fået fat på dem, kan du gå videre til de avancerede emner. Der er nogle potentielle ulemper ved ORM'er:
- Du skal skrive din model, inden eventuelle forespørgsler kan køre.
- Det er en ny ny syntaks at lære.
- Det kan være for kompliceret til enkle behov.
- Du skal have et godt databasedesign til at begynde med.
Disse spørgsmål er ikke et stort problem alene, men det er ting man skal passe på. Hvis du arbejder med en eksisterende database, kan du blive fanget.
Hvis du ikke er overbevist om, at en ORM er det rigtige værktøj til dig, skal du sørge for at læse om de vigtige SQL-kommandoer, som programmører skal vide 13 Vigtigste SQL-kommandoer Enhver programmer skal vide 13 Vigtigste SQL-kommandoer Enhver programmer skal vide enhver stor eller dynamisk websted bruger en database på en eller anden måde, og når den kombineres med Structured Query Language (SQL), er mulighederne for at manipulere data virkelig uendelige. .