Alt hvad du behøver at vide om Python og objektrelationelle kort

Alt hvad du behøver at vide om Python og objektrelationelle kort

Du har måske hørt om objekt-relationel kortlægning (ORM). Du har måske endda brugt en, men hvad er de egentlig? Og hvordan bruger du dem i Python?





Her er alt hvad du behøver at vide om ORM'er og Python.





Hvad er en ORM?

Objekt-relationel kortlægning (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, der er knyttet til objekter.





Det lyder måske 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 -hash, som forklaret i hjemmesidens adgangskodesikkerhed. Dette er ikke et problem for simple use cases --- du foretager beregningen, før du indsætter. Men hvad nu hvis du skal indsætte en post mange steder i koden? Hvad hvis en anden programmør indsætter i dit bord, og du ikke ved det?



Ved at bruge en ORM kan du skrive kode for at sikre, at når og hvor som helst en 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 , men ORM'er arbejder sammen med OOP -principper for at kontrollere adgangen til en database.





Der er visse ting at være opmærksom på, når du bruger en ORM, og der er omstændigheder, hvor du måske ikke vil bruge en, men de anses generelt for at være en god ting at have, især i en stor kodebase.

ORM'er i Python ved hjælp af SQLAlchemy

Ligesom mange andre 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 genopfinde hjulet?





Følgende eksempler bruger alle SQLAchemy , en populær Python ORM, men mange af principperne gælder uanset implementeringen.

Opsætning af Python til SQLAlchemy

Inden 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. Selvom ældre versioner fungerer, har nedenstående kode brug for en vis ændring, før den kører. Ikke sikker på forskellene? Vores Python ofte stillede spørgsmål dækker alle forskelle.

Inden kodning skal du oprette et Python -miljø, som forhindrer problemer med andre importerede Python -pakker.

Sørg for, at du har PIP, Python -pakkehåndtereren installeret, som leveres med de fleste moderne versioner af Python.

Når du er klar til at gå, kan du begynde med at gøre SQLAlchemy klar. Inden for dit Python -miljø på kommandolinjen skal du installere SQLAlchemy med pip installere kommando:

pip install SQLAlchemy-1.2.9

Det 1.2.9 er versionsnummeret. Du kan lade dette være for at få den nyeste pakke, men det er god praksis at være specifik. Du ved ikke, hvornår en ny udgivelse kan bryde din nuværende kode.

Nu er du klar til at begynde at kode. Du skal muligvis forberede din database til at acceptere en Python -forbindelse, men følgende eksempler bruger alle en SQLite database oprettet i hukommelsen nedenfor.

Modeller i SQLAlchemy

En af nøglekomponenterne i en ORM er a model . Dette er en Python -klasse, der beskriver, hvordan et bord skal se ud, og hvordan det skal fungere. Det er ORM -versionen af Opret tabel sætning i SQL. Du skal bruge en model for hver tabel i din database.

Åbn din foretrukne teksteditor eller IDE, og opret en ny fil kaldet test.py . Indtast denne startkode, gem filen, og kør den:

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

Denne kode gør flere ting. Importen er nødvendig, så Python forstår, hvor de skal finde de SQLAlchemy -moduler, den har brug for. Dine modeller vil bruge deklarativ_base senere, og det konfigurerer alle nye modeller til at fungere som forventet.

Det create_engine metode 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 udført.

Endelig er create_all metode opretter alle de tabeller, der er defineret i dine tilstande i din database. Da du endnu ikke har defineret nogen modeller, sker der ikke noget. Kør denne kode for at sikre, at du ikke har problemer eller stavefejl.

Lad os lave en model. Tilføj en anden import til toppen af ​​din fil:

from sqlalchemy import Column, Integer, String

Dette importerer Kolonne , Heltal , og Snor moduler fra SQLAlchemy. De definerer, hvordan databasetabeller, felter, kolonner og datatyper fungerer.

Under deklarativ_base , opret din modelklasse:

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

Dette enkle eksempel bruger biler, men dine tabeller kan indeholde data.

Hver klasse skal arve Grundlag . Dit databasetabelnavn er defineret i __tabelnavn__ . Dette burde være det samme som klassens navn, men dette er bare en anbefaling, og intet går i stykker, hvis de ikke matcher.

Endelig er hver kolonne defineret som en pythonvariabel inden for klassen. Der bruges forskellige datatyper, og primærnøgle attribut fortæller SQLAlchemy at oprette id kolonne som en primær nøgle.

Fortsæt og tilføj en sidste import, denne gang for Fremmed nøgle modul. Tilføj dette sammen med din Kolonne importere:

from sqlalchemy import Column, ForeignKey, Integer, String

Opret nu en anden modelklasse. Denne klasse kaldes Bilejere , og gemmer ejeroplysninger om specifikke biler, der er gemt i Biler bord:

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)

Der er flere nye attributter introduceret her. Det bil_id feltet er defineret som en fremmed nøgle. Det er knyttet til id i biler bord. Læg mærke til, hvordan tabellnavnet med små bogstaver bruges, i stedet for klassenavnet med store bogstaver.

Endelig en attribut af bil er defineret som a forhold . Dette giver din model adgang til Biler tabellen gennem denne variabel. Dette er vist nedenfor.

Hvis du kører denne kode nu, vil du se, at der ikke sker noget. Dette er fordi du ikke har fortalt det 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 idé at placere din logik i sin egen klasse og fil, men foreløbig kan den blive ved siden af ​​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 INDSÆT udsagn i SQL. SQLAlchemy håndterer dette for dig. Sådan indsætter du en række i Biler model. Start med en ny import til sessionmaker :

from 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=engine)
session = DBSession()

Læg nu dette under din create_all udmelding:

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

Lad os bryde den kode ned. Variablen bil 1 er defineret som et objekt baseret på Biler model. Dens mærke og farve er indstillet som parametre. Dette er som at sige 'lav mig en bil, men skriv det 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:

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

Denne kode er næsten identisk med den tidligere indsats for Biler model. Hovedforskellen her er det bil_id er en fremmed nøgle, så har brug for et række -id, der findes i den anden tabel. Dette tilgås via bil1.id ejendom.

Du behøver ikke at forespørge i databasen eller returnere nogen id'er, da SQLAlchemy håndterer dette for dig (så længe du forpligter dataene først).

Læsning af data

Når du har skrevet nogle data, kan du begynde at læse dem tilbage. Sådan kan du forespørge på Biler og Bilejere borde:

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

Det er så enkelt. Ved at bruge forespørgsel metode fundet i session , angiver du modellen, og bruger derefter alle metode til at hente alle resultaterne. 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 via objektet:

print(result[0].color)

Dette udskriver farven 'sølv', da posten er den første række. Du kan sløjfe over resultatobjektet, hvis du vil.

Da du definerede forholdet i din model, er det muligt at få adgang til data i relaterede tabeller uden at angive et join:

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

Dette fungerer, fordi din model indeholder detaljer om din bordstruktur og bil attributten blev defineret som et link til biler bord.

Hvad kan du ikke lide ved ORM'er?

Denne vejledning dækkede kun det grundlæggende, men når du har fået styr på dem, kan du gå videre med de avancerede emner. Der er nogle potentielle ulemper ved ORM'er:

  • Du skal skrive din model, før nogen forespørgsler kan køre.
  • Det er en anden ny syntaks at lære.
  • Det kan være for komplekst til simple 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 for dig, skal du sørge for at læse om vigtige SQL -kommandoer, programmerere burde kende .

Del Del Tweet E -mail Skal du opgradere til Windows 11 med det samme?

Windows 11 kommer snart, men skal du opdatere så hurtigt som muligt eller vente et par uger? Lad os finde ud af det.

Læs Næste
Relaterede emner
  • Programmering
  • Python
  • SQL
  • Kodning Tutorials
Om forfatteren Joe Coburn(136 artikler udgivet)

Joe er uddannet i datalogi fra University of Lincoln, UK. Han er en professionel softwareudvikler, og når han ikke flyver med droner eller skriver musik, kan han ofte findes tage fotos eller producere videoer.

er ps4 -spil kompatible med ps5
Mere fra Joe Coburn

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere