Alles wat u moet weten over Python en Object-Relational Maps

Alles wat u moet weten over Python en Object-Relational Maps / Programming

Je hebt misschien wel gehoord van object-relationele mapping (ORM). Misschien heb je er zelfs een gebruikt, maar wat zijn ze precies? En hoe gebruik je ze in Python?

Hier is alles wat u moet weten over ORM's en Python.

Wat is een ORM?

Object-relationele toewijzing (ORM) is een programmeertechniek die wordt gebruikt om toegang te krijgen tot een database. Het toont uw database in een reeks objecten. U hoeft geen SQL-opdrachten te schrijven om gegevens in te voegen of op te halen, u gebruikt een reeks attributen en methoden die aan objecten zijn gekoppeld.

Het klinkt misschien ingewikkeld en onnodig, maar ze kunnen u veel tijd besparen en helpen om de toegang tot uw database te beheren.

Hier is een voorbeeld. Stel dat telkens wanneer u een wachtwoord in uw database invoegt u het wilt hashen, zoals uitgelegd in de beveiliging van het website-wachtwoord. Elke beveiligde website doet dit met uw wachtwoord Elke beveiligde website doet dit met uw wachtwoord. Hebt u zich ooit afgevraagd hoe websites uw wachtwoord beschermen tegen gegevens? inbreuken? Lees verder . Dit is geen probleem voor eenvoudige use-cases - u doet de berekening voordat u deze invoegt. Maar wat als u op veel plaatsen in de code een record moet invoegen? Wat als een andere programmeur in uw tabel invoegt en u niet kent?

Door een ORM te gebruiken, kunt u code schrijven om ervoor te zorgen dat waar en wanneer een rij of veld in uw database wordt geopend, uw andere aangepaste code eerst wordt uitgevoerd.

Dit werkt ook als een “enige bron van waarheid”. Als u een aangepaste berekening wilt wijzigen, hoeft u deze alleen op één plaats te wijzigen, niet meerdere. Het is mogelijk om veel van deze principes uit te voeren met object georiënteerde programmering (OOP) in Python A Beginner's Guide to Python Object-Oriented Programming A Beginners's Guide to Python Object-Oriented Programming Om ten volle te profiteren van de sterke punten van Python, wil je leren hoe Python werkt met object-oriented programming (OOP). Read More, maar ORM's werken samen met OOP-principes om de toegang tot een database te beheren.

Er zijn bepaalde dingen waar je op moet letten bij het gebruik van een ORM, en er zijn omstandigheden waar je misschien geen gebruik van wilt maken, maar ze worden over het algemeen als een goede zaak beschouwd, vooral in een grote codebase.

ORM's in Python met behulp van SQLAlchemy

Net als bij veel andere taken in Python, is het sneller en eenvoudiger om een ​​module te importeren dan om deze zelf te schrijven. Natuurlijk is het mogelijk om je eigen ORM te schrijven, maar waarom zou je het wiel opnieuw uitvinden?

De volgende voorbeelden gebruiken allemaal SQLAlchemy, een populaire ORM van Python, maar veel van de principes zijn van toepassing, ongeacht de implementatie.

Python instellen voor SQLAlchemy

Voordat je meteen naar binnen springt, moet je je machine instellen voor Python-ontwikkeling met SQLAlchemy.

Je moet Python 3.6 gebruiken om deze voorbeelden te volgen. Terwijl oudere versies werken, moet de onderstaande code worden aangepast voordat deze wordt uitgevoerd. Ben je niet zeker van de verschillen? Onze Python FAQ De meestgestelde vragen over Python programmeren De meestgestelde vragen over Python programmeren In dit artikel zullen we u alles vertellen wat u moet weten over Python als een beginner. Meer informatie omvat alle verschillen.

Voordat je gaat coderen, moet je een Python-omgeving instellen Leer hoe je de virtuele omgeving van Python gebruikt Leer hoe je de virtuele omgeving van Python gebruikt Of je nu een ervaren Python-ontwikkelaar bent of je bent nog maar net begonnen, het leren van een virtuele omgeving is essentieel voor elk Python-project. Meer lezen, waardoor problemen met andere geïmporteerde Python-pakketten worden voorkomen.

Zorg ervoor dat je PIP hebt, de Python-pakketbeheerder Hoe installeer je PIP voor Python op Windows, Mac en Linux Hoe installeer je PIP voor Python op Windows, Mac en Linux Veel Python-ontwikkelaars vertrouwen op een tool genaamd PIP voor Python om alles te maken veel eenvoudiger en sneller. Hier is hoe u PIP installeert. Read More geïnstalleerd, dat wordt geleverd met de meeste moderne versies van Python.

Als u klaar bent om te beginnen, kunt u beginnen met het gereed maken van SQLAlchemy. Vanuit de Python-omgeving in de opdrachtregel installeert u SQLAlchemy met de pip installeren commando:

pip install SQLAlchemy-1.2.9

De 1.2.9 is het versienummer. U kunt dit laten staan ​​om het nieuwste pakket te krijgen, maar het is een goede gewoonte om specifiek te zijn. Je weet niet wanneer een nieuwe release je huidige code kan breken.

Nu bent u klaar om te beginnen met coderen. Mogelijk moet u uw database voorbereiden om een ​​Python-verbinding te accepteren, maar de volgende voorbeelden gebruiken allemaal een SQLite-database die hieronder in het geheugen is gemaakt.

Modellen in SQLAlchemy

Een van de belangrijkste componenten van een ORM is een model-. Dit is een Python-klasse die beschrijft hoe een tabel eruit zou moeten zien en hoe deze zou moeten werken. Het is de ORM-versie van de CREËER TAFEL verklaring in SQL. U hebt een model nodig voor elke tabel in uw database.

Open uw favoriete teksteditor of IDE en maak een nieuw bestand met de naam test.py. Voer deze startercode in, sla het bestand op en voer het uit:

from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base Base = declarative_base () engine = create_engine ('sqlite: //') # Maak de database in het geheugen Base.metadata.create_all (engine) # Maak alle tabellen in de database 

Deze code doet verschillende dingen. De invoer is nodig zodat Python begrijpt waar de SQLAlchemy-modules die het nodig heeft, te vinden zijn. Uw modellen zullen de declarative_base later, en configureert het nieuwe modellen om naar verwachting te werken.

De create_engine methode maakt een nieuwe verbinding met uw database. Als u al een database heeft, moet u deze wijzigen sqlite: // naar de URI van uw database. Zoals het is, zal deze code alleen in het geheugen een nieuwe database creëren. De database wordt vernietigd zodra uw code is voltooid.

eindelijk, de create_all methode maakt alle tabellen die zijn gedefinieerd in uw modi in uw database. Omdat u nog geen modellen hebt gedefinieerd, gebeurt er niets. Ga je gang en voer deze code uit om ervoor te zorgen dat je geen problemen of typefouten hebt.

Laten we een model maken. Voeg nog een import toe aan de bovenkant van uw bestand:

van sqlalchemy importeren Kolom, Integer, String

Hiermee importeert u het Kolom, Geheel getal, en Draad modules van SQLAlchemy. Ze definiëren hoe de databasetabellen, velden, kolommen en datatypes werken.

Onder de declarative_base, maak je modelklasse aan:

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

Dit eenvoudige voorbeeld gebruikt auto's, maar uw tabellen kunnen gegevens bevatten.

Elke klasse moet erven Baseren. De naam van uw databasetabel wordt gedefinieerd in __tafel naam__. Dit moet hetzelfde zijn als de klassenaam, maar dit is slechts een aanbeveling en niets zal breken als ze niet overeenkomen.

Ten slotte wordt elke kolom gedefinieerd als een python-variabele binnen de klasse. Er worden verschillende gegevenstypen gebruikt en de hoofdsleutel attribuut vertelt SQLAlchemy om het te maken ID kaart kolom als een primaire sleutel.

Ga je gang en voeg een laatste import toe, deze keer voor de Vreemde sleutel module. Voeg dit toe naast uw Kolom importeren:

van sqlalchemy importeren Kolom, ForeignKey, Integer, String

Maak nu een tweede modelklasse. Deze klasse wordt genoemd CarOwners, en slaat eigenaargegevens op van specifieke auto's die zijn opgeslagen in de Cars tafel:

class CarOwners (Base): __tablename__ = 'carowners' id = Column (Integer, primary_key = True) name = Column (String (50), nullable = False) age = Column (Geheel getal, nullable = False) car_id = Kolom (Geheel getal, ForeignKey ('cars.id')) auto = relatie (auto's)

Er zijn verschillende nieuwe attributen geïntroduceerd hier. De car_id veld wordt gedefinieerd als een externe sleutel. Het is gekoppeld aan de ID kaart in de auto's tafel. Merk op hoe de naam van de kleine letters gebruikt wordt, in plaats van de naam van de hoofdklasse.

Eindelijk een attribuut van auto is gedefinieerd als a verhouding. Hierdoor heeft uw model toegang tot de Cars tabel door deze variabele. Dit wordt hieronder aangetoond.

Als u deze code nu uitvoert, ziet u dat er niets gebeurt. Dit komt omdat je het nog niet hebt verteld om nog iets opmerkelijks te doen.

Objecten in SQLAlchemy

Nu uw modellen zijn gemaakt, kunt u toegang krijgen tot de objecten en gegevens lezen en schrijven. Het is een goed idee om uw logica in zijn eigen klasse en bestand te plaatsen, maar voorlopig kan deze bij de modellen blijven.

Gegevens schrijven

In dit voorbeeld moet u enkele gegevens invoegen in de database voordat u deze kunt lezen. Als u een bestaande database gebruikt, heeft u mogelijk al gegevens. Hoe dan ook, het is nog steeds erg handig om te weten hoe je gegevens invoegt.

Je bent misschien gewend aan schrijven INSERT verklaringen in SQL. SQLAlchemy verwerkt dit voor u. U kunt als volgt een rij invoegen in de Cars model. Begin met een nieuwe import voor sessionmaker:

van sqlalchemy.orm import sessiemaker

Dit is nodig om het te maken sessie en DBSession objecten, die worden gebruikt om gegevens te lezen en te schrijven:

DBSession = sessionmaker (bind = engine) sessie = DBSession ()

Zet dit nu onder je create_all uitspraak:

car1 = Auto's (make = "Ford", color = "silver") session.add (car1) session.commit ()

Laten we die code opsplitsen. De variabele car1 is gedefinieerd als een object op basis van de Cars model. Het merk en de kleur zijn ingesteld als parameters. Dit is hetzelfde als zeggen “maak een auto voor me, maar schrijf het nog niet in de database”. Deze auto bestaat in het geheugen maar wacht om geschreven te worden.

Voeg de auto toe aan de sessie met session.add, en schrijf het vervolgens naar de database met session.commit.

Laten we nu een eigenaar toevoegen:

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

Deze code is bijna identiek aan de vorige invoeging voor de Cars model. Het belangrijkste verschil is hier car_id is een externe sleutel, dus heeft u een rij-ID nodig die in de andere tabel voorkomt. Dit is toegankelijk via de car1.id eigendom.

U hoeft de database niet te ondervragen of ids terug te sturen, omdat SQLAlchemy dit voor u afhandelt (zolang u de gegevens eerst vastlegt).

Gegevens lezen

Als je eenmaal wat gegevens hebt geschreven, kun je beginnen deze terug te lezen. Ga als volgt te werk om de Cars en CarOwners tabellen:

result = session.query (Auto's) .all ()

Zo simpel is het. Door de vraag methode gevonden in de sessie, u geeft het model op en gebruikt vervolgens de allemaal methode om alle resultaten op te halen. Als u weet dat er maar één resultaat is, kunt u de eerste methode:

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

Nadat u het model hebt opgevraagd en de geretourneerde resultaten in een variabele hebt opgeslagen, hebt u via het object toegang tot de gegevens:

afdruk (resultaat [0] .Kleur)

Dit drukt de kleur af “zilver”, omdat die record de eerste rij is. U kunt het resultaatobject doorlopen als u dat wilt.

Toen u de relatie in uw model definieerde, is het mogelijk om toegang te krijgen tot gegevens in gerelateerde tabellen zonder een join op te geven:

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

Dit werkt omdat uw model details van uw tabelstructuur bevat, en de auto kenmerk is gedefinieerd als een koppeling naar de auto's tafel.

Wat is niet leuk over ORM's?

Deze tutorial heeft alleen de basisprincipes behandeld, maar als je die onder de knie hebt, kun je verder gaan met de geavanceerde onderwerpen. Er zijn enkele mogelijke nadelen aan ORM's:

  • U moet uw model schrijven voordat er query's kunnen worden uitgevoerd.
  • Het is een nieuwe syntaxis om te leren.
  • Het is misschien te complex voor eenvoudige behoeften.
  • U moet om te beginnen een goed database-ontwerp hebben.

Deze problemen zijn niet alleen een groot probleem, maar het zijn dingen om op te letten. Als u met een bestaande database werkt, raakt u misschien betrapt.

Als je er niet van overtuigd bent dat een ORM de juiste tool voor je is, zorg dan dat je leest over de belangrijke SQL-opdrachten die programmeurs moeten kennen 13 Belangrijkste SQL-opdrachten Programmer moet 13 belangrijkste SQL-opdrachten weten Programmer moet dit weten Elke grote of dynamische opdracht website maakt op de een of andere manier gebruik van een database en in combinatie met Structured Query Language (SQL) zijn de mogelijkheden voor het manipuleren van gegevens echt eindeloos. Lees verder .

Ontdek meer over: Codeerhandleiding, Python, SQL.