Allt du behöver veta om Python och Object-Relational Maps
Du kanske har hört talas om objekt-relationell kartläggning (ORM). Du har kanske även använt en, men vad är de egentligen? Och hur använder du dem i Python?
Här är allt du behöver veta om ORM och Python.
Vad är en ORM?
Objektrelationell kartläggning (ORM) är en programmeringsteknik som används för att komma åt en databas. Den exponerar din databas i en serie objekt. Du behöver inte skriva SQL-kommandon för att infoga eller hämta data, du använder en serie attribut och metoder som är kopplade till objekt.
Det kan låta komplext och onödigt, men de kan spara mycket tid och hjälpa till att kontrollera åtkomst till din databas.
Här är ett exempel. Säg att när du sätter in ett lösenord i din databas vill du ha hash det som förklaras i webbplatsens lösenordsäkerhet. Varje säker webbplats gör det med ditt lösenord. Varje säker webbplats gör det med ditt lösenord Har du någonsin undrat hur webbplatser håller ditt lösenord säkert från data överträdelser? Läs mer . Detta är inte ett problem för enkla användningsfall - du gör beräkningen innan du sätter i. Men vad händer om du behöver lägga in en post på många ställen i koden? Vad händer om en annan programmerare sätter in i ditt bord, och du vet inte om?
Genom att använda en ORM kan du skriva kod för att se till att när och var som någon rad eller fält i din databas är åtkomst, körs din andra anpassade kod först.
Detta fungerar också som en “enda källa till sanning”. Om du vill ändra en anpassad beräkning behöver du bara ändra den på ett ställe, inte flera. Det är möjligt att utföra många av dessa principer med objektorienterad programmering (OOP) i Python A Beginners Guide till Python Object Oriented Programming En nybörjarhandledning till Python Object Oriented Programming För att dra full nytta av Pythons styrkor, vill du lära dig hur Python arbetar med objektorienterad programmering (OOP). Läs mer, men ORMs fungerar i takt med OOP-principerna för att kontrollera tillgången till en databas.
Det finns vissa saker att se upp för när du använder en ORM, och det finns omständigheter där du kanske inte vill använda en, men de anses allmänt vara en bra sak att ha, särskilt i en stor kodbas.
ORM i Python med SQLAlchemy
Liksom många uppgifter i Python är det snabbare och enklare att importera en modul än att skriva egna. Det är självklart möjligt att skriva en egen ORM, men varför återuppfinna hjulet?
Följande exempel använder alla SQLAlchemy, en populär Python ORM, men många av principerna gäller oavsett implementering.
Ställa in Python för SQLAlchemy
Innan du hoppar in, måste du konfigurera din maskin för Python-utveckling med SQLAlchemy.
Du måste använda Python 3.6 för att följa med dessa exempel. Medan äldre versioner kommer att fungera behöver koden nedan ändras innan den körs. Inte säker på skillnaderna? Vår Python FAQ De vanligaste frågorna om Python Programmering De vanligaste frågorna om Python Programmering I den här artikeln går vi igenom allt du behöver veta om Python som nybörjare. Läs mer täcker alla skillnader.
Innan du kodar bör du skapa en Python-miljö. Lär dig hur du använder Pythons virtuella miljö Lär dig hur du använder Pythons virtuella miljö Oavsett om du är en erfaren Python-utvecklare, eller om du bara har börjat, är det viktigt att du lär dig hur du installerar en virtuell miljö. för något Python-projekt. Läs mer, vilket kommer att förhindra problem med andra importerade Python-paket.
Se till att du har PIP, Python-pakethanteraren. Så här installerar du PIP för Python på Windows, Mac och Linux. Så här installerar du PIP för Python på Windows, Mac och Linux. Många Python-utvecklare använder sig av ett verktyg som heter PIP för Python för att göra allt mycket lättare och snabbare. Så här installerar du PIP. Läs mer installerat, som kommer med de flesta moderna versioner av Python.
När du är redo att gå, kan du börja med att få SQLAlchemy redo. Från din Python-miljö i kommandoraden, installera SQLAlchemy med pip installera kommando:
pip installera SQLAlchemy-1.2.9
De 1.2.9 är versionsnumret. Du kan lämna det här för att få det senaste paketet, men det är bra att vara specifik. Du vet inte när en ny version kan bryta din nuvarande kod.
Nu är du redo att börja kodning. Du kan behöva förbereda din databas för att acceptera en Python-anslutning, men följande exempel använder alla en SQLite-databas som skapats i minnet nedan.
Modeller i SQLAlchemy
En av nyckelkomponenterna i en ORM är a modell. Det här är en Python-klass som beskriver vad ett bord ska se ut och hur det ska fungera. Det är ORM-versionen av SKAPA BORD uttalande i SQL. Du behöver en modell för varje tabell i din databas.
Öppna din favorittextredigerare eller IDE, och skapa en ny fil som heter test.py. Ange denna startkod, spara filen och kör den:
från sqlalchemy import create_engine från sqlalchemy.ext.declarative import declarative_base Base = declarative_base () engine = create_engine ('sqlite: //') # Skapa databasen i minnet Base.metadata.create_all (motor) # Skapa alla tabeller i databasen
Denna kod gör flera saker. Importen är nödvändig så att Python förstår var man ska hitta de SQLAlchemy-moduler som behövs. Dina modeller kommer att använda declarative_base senare, och det konfigurerar nya modeller för att fungera som förväntat.
De create_engine Metoden skapar en ny anslutning till din databas. Om du redan har en databas måste du ändra sqlite: // till din databas URI. Som det kommer den här koden att skapa en ny databas i minnet bara. Databasen förstörs när din kod är klar.
Slutligen, den create_all Metod skapar alla tabeller som definieras i dina lägen i din databas. Eftersom du inte har definierat några modeller ännu, kommer inget att hända. Fortsätt och kör den här koden, för att du inte har några problem eller skrivfel.
Låt oss göra en modell. Lägg till en annan import till toppen av din fil:
från sqlalchemy import kolumn, helhet, sträng
Detta importerar Kolumn, Heltal, och Sträng moduler från SQLAlchemy. De definierar hur databas tabeller, fält, kolumner och datatyper fungerar.
Under declarative_base, skapa din modellklass:
klassbilar (bas): __tablename__ = 'cars' id = kolumn (heltal, primary_key = sant) make = kolumn (sträng (50), nullbar = falsk) färg = kolumn (sträng (50), nullbar = falsk)
Det här enkla exemplet använder bilar, men dina tabeller kan innehålla några data.
Varje klass måste ärva Bas. Ditt databas tabellnamn är definierat i __tablename__. Detta borde vara detsamma som klassnamnet, men det här är bara en rekommendation, och ingenting kommer att bryta om de inte matchar.
Slutligen definieras varje kolumn som en pythonvariabel inom klassen. Olika datatyper används, och primärnyckel attributet berättar SQLAlchemy att skapa id kolumn som en primär nyckel.
Fortsätt och lägg till en sista import, den här gången för Främmande nyckel modul. Lägg till detta bredvid din Kolumn importera:
från sqlalchemy import kolumn, foreignkey, helhet, sträng
Skapa nu en andra modellklass. Denna klass heter CarOwners, och lagrar ägarnas uppgifter om specifika bilar lagrade i bilar tabell:
klassen CarOwners (Base): __tablename__ = 'carowners id = Kolumn (heltal, primary_key = True) namn = Kolumn (String (50), nullbar = Falsk) Ålder = Kolumn (Heltal, nullerlig = Falsk) car_id = Kolumn ForeignKey ('cars.id')) bil = förhållande (bilar)
Det finns flera nya attribut som presenteras här. De car_id Fältet definieras som en främmande nyckel. Den är kopplad till id i bilar tabell. Lägg märke till hur bokstavsnamnet med små bokstäver används, instans av stor bokstavsnamn.
Slutligen ett attribut av bil definieras som a relation. Detta gör det möjligt för din modell att komma åt bilar bord genom denna variabel. Detta visas nedan.
Om du kör den här koden nu ser du att inget händer. Detta beror på att du inte har sagt det att göra något märkbart än.
Objekt i SQLAlchemy
Nu när dina modeller skapas kan du börja komma åt objekten och läsa och skriva data. Det är en bra idé att placera din logik i sin egen klass och fil, men för nu kan den stanna bredvid modellerna.
Skriva data
I det här exemplet måste du infoga vissa data i databasen innan du kan läsa den. Om du använder en befintlig databas kanske du redan har data. Hur som helst är det fortfarande mycket användbart att veta hur man sätter in data.
Du kan vara van att skriva FÖRA IN uttalanden i SQL. SQLAlchemy hanterar detta för dig. Så här lägger du in en rad i bilar modell. Börja med en ny import till sessionmaker:
från sqlalchemy.orm import sessionmaker
Detta behövs för att skapa session och DBSession objekt som används för att läsa och skriva data:
DBSession = sessionmaker (bind = motor) session = DBSession ()
Lägg nu detta under din create_all påstående:
car1 = Bilar (make = "Ford", färg = "silver") session.add (car1) session.commit ()
Låt oss bryta ner den koden. Variabeln car1 definieras som ett objekt baserat på bilar modell. Dess märke och färg är inställda som parametrar. Det här är som att säga “gör mig en bil, men skriv inte den till databasen än”. Denna bil finns i minnet men väntar på att skrivas.
Lägg bilen till sessionen med session.add, och skriv det till databasen med session.commit.
Nu lägger vi till en ägare:
owner1 = CarOwners (namn = "Joe", ålder = "99", car_id = (car1.id)) session.add (owner1) session.commit ()
Denna kod är nästan identisk med föregående insats för bilar modell. Huvudskillnaden här är det car_id är en främmande nyckel så behöver en rad-id som finns i den andra tabellen. Detta är tillgängligt via car1.id fast egendom.
Du behöver inte fråga databasen eller returnera några ids, eftersom SQLAlchemy hanterar detta för dig (så länge du begår data först).
Läsdata
När du har skrivit några data kan du börja läsa den igen. Så här frågar du bilar och CarOwners tabeller:
result = session.query (Cars) .all ()
Det är så enkelt. Genom att använda fråga metod som hittades i session, Du anger modellen och använder sedan Allt metod för att hämta alla resultat. Om du vet finns det bara ett resultat, då kan du använda först metod:
result = session.query (Cars) .first ()
När du har frågat modellen och lagrat dina returnerade resultat i en variabel, kan du komma åt data genom objektet:
trycket (resultat [0] .color)
Detta skriver ut färgen “silver-”, som den här posten är första raden. Du kan slinga över resultatobjektet om du vill.
När du har definierat förhållandet i din modell är det möjligt att få tillgång till data i relaterade tabeller utan att ange ett deltagande:
result = session.query (CarOwners) .all () print (result [0] .name) print (result [0] .car.color)
Detta fungerar eftersom din modell innehåller detaljer om din tabellstruktur och bil attribut definierades som en länk till bilar tabell.
Vad kan inte gilla om ORM?
Denna handledning täckte bara de allra flesta grunderna, men när du har hängt på dem kan du gå vidare på avancerade ämnen. Det finns några potentiella nackdelar med ORM: er:
- Du måste skriva din modell innan några frågor kan köras.
- Det är en annan ny syntax att lära.
- Det kan vara för komplicerat för enkla behov.
- Du måste ha en bra databasdesign till att börja med.
Dessa problem är inte ett stort problem på egen hand, men det är saker att se upp för. Om du arbetar med en befintlig databas kan du bli uttagen.
Om du inte är övertygad om en ORM är det rätta verktyget för dig, var noga med att du läser om de viktiga SQL-kommandona som programmerare borde veta. 13 Viktiga SQL-kommandon Varje programmerare borde veta 13 Viktigaste SQL-kommandon Varje programmerare borde veta varje stor eller dynamisk Webbplatsen använder en databas på något sätt, och i kombination med Structured Query Language (SQL) är möjligheterna att manipulera data verkligen oändliga. Läs mer .
Utforska mer om: Kodningstutorials, Python, SQL.