Alles wat u moet weten over Python en object-relationele kaarten

Alles wat u moet weten over Python en object-relationele kaarten

Je hebt misschien 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 mapping (ORM) is een programmeertechniek die wordt gebruikt om toegang te krijgen tot een database. Het stelt uw database bloot aan een reeks objecten. U hoeft geen SQL-commando's 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 controleren.

Hier is een voorbeeld. Zeg dat wanneer u een wachtwoord in uw database invoert, u het wilt hashen, zoals uitgelegd in Website wachtwoordbeveiliging . Dit is geen probleem voor eenvoudige gebruiksgevallen --- 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 weet er niets van?



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

Dit fungeert ook als een 'single source of truth'. Als u een aangepaste berekening wilt wijzigen, hoeft u deze slechts op één plaats te wijzigen, niet op meerdere. Het is mogelijk om veel van deze principes uit te voeren met: objectgeoriënteerd programmeren (OOP) in Python , maar ORM's werken samen met OOP-principes om de toegang tot een database te regelen.





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

ORM's in Python met SQLAlchemy

Zoals veel taken in Python, is het sneller en gemakkelijker om een ​​module te importeren dan je eigen module te schrijven. Natuurlijk is het mogelijk om je eigen ORM te schrijven, maar waarom het wiel opnieuw uitvinden?





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

Python instellen voor SQLAlchemy

Voordat je meteen aan de slag gaat, moet je je machine instellen voor Python-ontwikkeling met SQLAlchemy.

U moet Python 3.6 gebruiken om deze voorbeelden te volgen. Hoewel oudere versies zullen werken, moet de onderstaande code worden aangepast voordat deze wordt uitgevoerd. Ben je niet zeker van de verschillen? Onze Python FAQ behandelt alle verschillen.

Voordat u gaat coderen, moet u een Python-omgeving opzetten, die problemen met andere geïmporteerde Python-pakketten voorkomt.

Zorg dat je hebt PIP, de Python-pakketbeheerder geïnstalleerd, die wordt geleverd met de meeste moderne versies van Python.

Zodra u klaar bent om te gaan, kunt u beginnen met het voorbereiden van SQLAlchemy. Installeer vanuit uw Python-omgeving in de opdrachtregel SQLAlchemy met de pip installeren opdracht:

pip install SQLAlchemy-1.2.9

De 1.2.9 is het versienummer. U kunt dit uitschakelen 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 ben je 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 schetst hoe een tabel eruit zou moeten zien en hoe deze zou moeten werken. Het is de ORM-versie van de MAAK TAFEL verklaring in SQL. Je hebt een model nodig voor elke tabel in je database.

Open uw favoriete teksteditor of IDE en maak een nieuw bestand met de naam test.py . Voer deze startcode 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://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

Deze code doet verschillende dingen. De imports zijn nodig zodat Python begrijpt waar de SQLAlchemy-modules te vinden zijn die het nodig heeft. Uw modellen gebruiken de declarative_base later, en het configureert alle nieuwe modellen om te werken zoals verwacht.

De create_engine methode maakt een nieuwe verbinding met uw database. Als u al een database heeft, moet u deze wijzigen sqlite:// naar uw database-URI. Zoals het is, zal deze code alleen een nieuwe database in het geheugen maken. De database wordt vernietigd zodra uw code is uitgevoerd.

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

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

from sqlalchemy import Column, Integer, String

Dit importeert de Kolom , Geheel getal , en Snaar modules van SQLAlchemy. Ze definiëren hoe de databasetabellen, velden, kolommen en gegevenstypen werken.

onder de declarative_base , maak uw modelklasse:

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

In dit eenvoudige voorbeeld worden auto's gebruikt, maar uw tabellen kunnen alle gegevens bevatten.

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

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

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

from sqlalchemy import Column, ForeignKey, Integer, String

Maak nu een tweede modelklasse aan. Deze klas heet Auto-eigenaren en slaat eigenaarsgegevens op van specifieke auto's die zijn opgeslagen in de auto's tafel:

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)

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

Tot slot een attribuut van auto wordt gedefinieerd als a relatie . Hierdoor heeft uw model toegang tot de auto's tabel via deze variabele. Dit wordt hieronder gedemonstreerd.

Als u deze code nu uitvoert, ziet u dat er niets gebeurt. Dit komt omdat je het nog niet hebt verteld om iets merkbaars 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 je logica in zijn eigen klasse en bestand te plaatsen, maar voorlopig kan het naast de modellen blijven.

Gegevens schrijven

In dit voorbeeld moet u enkele gegevens in de database invoegen 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 u gegevens moet invoegen.

Je bent misschien gewend om te schrijven INSERT uitspraken in SQL. SQLAlchemy regelt dit voor u. Hier leest u hoe u een rij invoegt in de auto's model. Begin met een nieuwe import voor sessiemaker :

from sqlalchemy.orm import sessionmaker

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

DBSession = sessionmaker(bind=engine)
session = DBSession()

Zet dit nu onder je create_all uitspraak:

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

Laten we die code ontleden. de variabele auto1 wordt gedefinieerd als een object op basis van de auto's model. Het merk en de kleur worden ingesteld als parameters. Dit is hetzelfde als zeggen 'maak me een auto, maar schrijf hem nog niet in de database'. Deze auto bestaat in het geheugen, maar wacht om te worden geschreven.

Voeg de auto toe aan de sessie met sessie.add , en schrijf het dan naar de database met sessie.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 auto's model. Het belangrijkste verschil hier is dat: car_id is een externe sleutel, dus heeft een rij-ID nodig die in de andere tabel bestaat. Dit is toegankelijk via de auto1.id eigendom.

U hoeft de database niet te doorzoeken of id's te retourneren, aangezien SQLAlchemy dit voor u afhandelt (zolang u de gegevens eerst vastlegt).

Gegevens lezen

Nadat u enkele gegevens hebt geschreven, kunt u beginnen deze terug te lezen. Hier leest u hoe u de . kunt opvragen auto's en Auto-eigenaren tafels:

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

Zo simpel is het. Door gebruik te maken van de vraag methode gevonden in de sessie , geeft u het model op en gebruikt u vervolgens de alle methode om alle resultaten op te halen. Als u weet dat er maar één resultaat zal zijn, kunt u de gebruiken eerst methode:

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

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

print(result[0].color)

Dit drukt de kleur 'zilver' af, aangezien dat record de eerste rij is. U kunt desgewenst over het resultaatobject lopen.

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

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

Dit werkt omdat uw model details van uw tabelstructuur bevat, en de auto attribuut werd gedefinieerd als een link naar de auto's tafel.

Wat is er niet leuk aan ORM's?

Deze tutorial behandelde alleen de basis, maar als je die eenmaal onder de knie hebt, kun je verder gaan met de geavanceerde onderwerpen. Er zijn enkele potentiële nadelen aan ORM's:

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

Deze problemen zijn op zichzelf geen groot probleem, maar het zijn dingen om op te letten. Als u met een bestaande database werkt, kunt u worden betrapt.

Als u er niet van overtuigd bent dat een ORM de juiste tool voor u is, lees dan zeker over de belangrijke SQL-commando's die programmeurs moeten weten .

Deel Deel Tweeten E-mail Moet u onmiddellijk upgraden naar Windows 11?

Windows 11 komt binnenkort, maar moet je zo snel mogelijk updaten of een paar weken wachten? Laten we het uitzoeken.

Lees volgende
Gerelateerde onderwerpen
  • Programmeren
  • Python
  • SQL
  • Codeerhandleidingen
Over de auteur Joe Coburn(136 gepubliceerde artikelen)

Joe is afgestudeerd in computerwetenschappen aan de Universiteit van Lincoln, VK. Hij is een professionele softwareontwikkelaar en als hij niet met drones vliegt of muziek schrijft, is hij vaak te vinden om foto's te maken of video's te maken.

hoe de xbox one-controller te repareren
Meer van Joe Coburn

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren