Alles, was Sie über Python und objektrelationale Karten wissen müssen

Alles, was Sie über Python und objektrelationale Karten wissen müssen

Vielleicht haben Sie schon von objektrelationalem Mapping (ORM) gehört. Sie haben vielleicht sogar einen benutzt, aber was genau sind sie? Und wie verwendet man sie in Python?





Hier finden Sie alles, was Sie über ORMs und Python wissen müssen.





Was ist ein ORM?

Das objektrelationale Mapping (ORM) ist eine Programmiertechnik, die verwendet wird, um auf eine Datenbank zuzugreifen. Es macht Ihre Datenbank in einer Reihe von Objekten verfügbar. Sie müssen keine SQL-Befehle schreiben, um Daten einzufügen oder abzurufen, Sie verwenden eine Reihe von Attributen und Methoden, die an Objekte angehängt sind.





Es mag komplex und unnötig klingen, aber sie können Ihnen viel Zeit sparen und helfen, den Zugriff auf Ihre Datenbank zu kontrollieren.

Hier ist ein Beispiel. Sagen Sie, dass Sie jedes Mal, wenn Sie ein Passwort in Ihre Datenbank einfügen, es hashen möchten, wie in Website-Passwortsicherheit beschrieben. Dies ist für einfache Anwendungsfälle kein Problem --- Sie führen die Berechnung vor dem Einfügen durch. Aber was ist, wenn Sie an vielen Stellen im Code einen Datensatz einfügen müssen? Was ist, wenn ein anderer Programmierer in Ihre Tabelle einfügt und Sie es nicht wissen?



Mit einem ORM können Sie Code schreiben, um sicherzustellen, dass immer und überall, wo auf eine Zeile oder ein Feld in Ihrer Datenbank zugegriffen wird, Ihr anderer, benutzerdefinierter Code zuerst ausgeführt wird.

Dies fungiert auch als „Single Source of Truth“. Wenn Sie eine benutzerdefinierte Berechnung ändern möchten, müssen Sie sie nur an einer Stelle ändern, nicht an mehreren. Es ist möglich, viele dieser Prinzipien mit zu erfüllen Objektorientierte Programmierung (OOP) in Python , aber ORMs arbeiten mit OOP-Prinzipien zusammen, um den Zugriff auf eine Datenbank zu kontrollieren.





Es gibt bestimmte Dinge, auf die Sie bei der Verwendung eines ORM achten müssen, und es gibt Situationen, in denen Sie möglicherweise keinen verwenden möchten, aber sie werden im Allgemeinen als eine gute Sache angesehen, insbesondere in einer großen Codebasis.

ORMs in Python mit SQLAlchemy

Wie bei vielen Aufgaben in Python ist es schneller und einfacher, ein Modul zu importieren, als ein eigenes zu schreiben. Natürlich ist es möglich, ein eigenes ORM zu schreiben, aber warum das Rad neu erfinden?





Die folgenden Beispiele verwenden alle SQLAlchemie , ein beliebtes Python-ORM, aber viele der Prinzipien gelten unabhängig von der Implementierung.

Python für SQLAlchemy einrichten

Bevor Sie direkt loslegen, müssen Sie Ihren Computer für die Python-Entwicklung mit SQLAlchemy einrichten.

Sie müssen Python 3.6 verwenden, um diesen Beispielen zu folgen. Ältere Versionen funktionieren zwar, der folgende Code muss jedoch geändert werden, bevor er ausgeführt werden kann. Sie sind sich bei den Unterschieden nicht sicher? Unsere Python-FAQ deckt alle Unterschiede ab.

Vor dem Codieren sollten Sie eine Python-Umgebung einrichten, die Probleme mit anderen importierten Python-Paketen verhindert.

Stell sicher dass du hast PIP, der Python-Paketmanager installiert, das mit den meisten modernen Python-Versionen geliefert wird.

Sobald Sie bereit sind, können Sie damit beginnen, SQLAlchemy vorzubereiten. Installieren Sie in Ihrer Python-Umgebung in der Befehlszeile SQLAlchemy mit dem pip installieren Befehl:

pip install SQLAlchemy-1.2.9

Die 1.2.9 ist die Versionsnummer. Sie können dies weglassen, um das neueste Paket zu erhalten, aber es empfiehlt sich, genau zu sein. Sie wissen nicht, wann eine neue Version Ihren aktuellen Code beschädigen könnte.

Jetzt können Sie mit der Codierung beginnen. Möglicherweise müssen Sie Ihre Datenbank vorbereiten, um eine Python-Verbindung zu akzeptieren, aber die folgenden Beispiele verwenden alle ein SQLite unten im Arbeitsspeicher erstellte Datenbank.

Modelle in SQLAlchemy

Eine der Schlüsselkomponenten eines ORM ist a Modell . Dies ist eine Python-Klasse, die umreißt, wie eine Tabelle aussehen und wie sie funktionieren sollte. Es ist die ORM-Version des TABELLE ERSTELLEN Anweisung in SQL. Sie benötigen ein Modell für jede Tabelle in Ihrer Datenbank.

Öffnen Sie Ihren bevorzugten Texteditor oder Ihre IDE und erstellen Sie eine neue Datei namens test.py . Geben Sie diesen Startcode ein, speichern Sie die Datei und führen Sie sie aus:

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

Dieser Code macht mehrere Dinge. Die Importe sind notwendig, damit Python versteht, wo die benötigten SQLAlchemy-Module zu finden sind. Ihre Modelle verwenden die declarative_base später und konfiguriert alle neuen Modelle so, dass sie wie erwartet funktionieren.

Die create_engine -Methode erstellt eine neue Verbindung zu Ihrer Datenbank. Wenn Sie bereits eine Datenbank haben, müssen Sie diese ändern sqlite:// zu Ihrer Datenbank-URI. So wie es ist, erstellt dieser Code eine neue Datenbank nur im Speicher. Die Datenbank wird zerstört, sobald die Ausführung Ihres Codes abgeschlossen ist.

Endlich, das create_all -Methode erstellt alle in Ihren Modi definierten Tabellen in Ihrer Datenbank. Da Sie noch keine Modelle definiert haben, wird nichts passieren. Fahren Sie fort und führen Sie diesen Code aus, um sicherzustellen, dass Sie keine Probleme oder Tippfehler haben.

Machen wir ein Modell. Fügen Sie am Anfang Ihrer Datei einen weiteren Import hinzu:

from sqlalchemy import Column, Integer, String

Dies importiert die Spalte , Ganze Zahl , und Zeichenfolge Module von SQLAlchemy. Sie definieren, wie die Datenbanktabellen, Felder, Spalten und Datentypen funktionieren.

Unter dem declarative_base , erstellen Sie Ihre Modellklasse:

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

In diesem einfachen Beispiel werden Autos verwendet, aber Ihre Tabellen können beliebige Daten enthalten.

Jede Klasse muss erben Base . Ihr Datenbanktabellenname ist definiert in __Tabellenname__ . Dies sollte mit dem Klassennamen identisch sein, aber dies ist nur eine Empfehlung, und nichts wird kaputt gehen, wenn sie nicht übereinstimmen.

Schließlich wird jede Spalte als Python-Variable innerhalb der Klasse definiert. Es werden unterschiedliche Datentypen verwendet und die Primärschlüssel -Attribut weist SQLAlchemy an, die Ich würde Spalte als Primärschlüssel.

Fahren Sie fort und fügen Sie einen letzten Import hinzu, diesmal für die Unbekannter Schlüssel Modul. Fügen Sie dies neben Ihrem . hinzu Spalte importieren:

from sqlalchemy import Column, ForeignKey, Integer, String

Erstellen Sie nun eine zweite Modellklasse. Diese Klasse heißt Autobesitzer , und speichert Besitzerdetails bestimmter Autos, die im Autos Tisch:

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)

Hier wurden mehrere neue Attribute eingeführt. Die auto_id Feld ist als Fremdschlüssel definiert. Es ist verbunden mit dem Ich würde in dem Autos Tisch. Beachten Sie, wie der Tabellenname in Kleinbuchstaben anstelle des Klassennamens in Großbuchstaben verwendet wird.

Schließlich ein Attribut von Wagen ist definiert als a Beziehung . Dadurch kann Ihr Modell auf die Autos Tabelle durch diese Variable. Dies wird im Folgenden demonstriert.

Wenn Sie diesen Code jetzt ausführen, werden Sie feststellen, dass nichts passiert. Dies liegt daran, dass Sie ihm noch nicht gesagt haben, dass es etwas Auffälliges tun soll.

Objekte in SQLAlchemy

Nachdem Ihre Modelle erstellt wurden, können Sie auf die Objekte zugreifen und Daten lesen und schreiben. Es ist eine gute Idee, Ihre Logik in einer eigenen Klasse und Datei zu platzieren, aber vorerst kann sie neben den Modellen bleiben.

Schreiben von Daten

In diesem Beispiel müssen Sie einige Daten in die Datenbank einfügen, bevor Sie sie lesen können. Wenn Sie eine vorhandene Datenbank verwenden, verfügen Sie möglicherweise bereits über Daten. In jedem Fall ist es immer noch sehr nützlich zu wissen, wie man Daten einfügt.

Vielleicht bist du es gewohnt zu schreiben EINFÜGUNG Anweisungen in SQL. SQLAlchemy übernimmt dies für Sie. So fügen Sie eine Zeile in die ein Autos Modell. Beginnen Sie mit einem neuen Import für Sitzungsmacher :

from sqlalchemy.orm import sessionmaker

Dies wird benötigt, um die Sitzung und DBSession Objekte, die zum Lesen und Schreiben von Daten verwendet werden:

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

Lege das jetzt unter dein create_all Stellungnahme:

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

Lassen Sie uns diesen Code aufschlüsseln. Die Variable Auto1 ist definiert als ein Objekt basierend auf dem Autos Modell. Seine Marke und Farbe werden als Parameter eingestellt. Das ist so, als würde man sagen: „Mach mir ein Auto, aber schreibe es noch nicht in die Datenbank“. Dieses Auto existiert im Speicher, wartet aber darauf, beschrieben zu werden.

Fügen Sie das Auto der Sitzung hinzu mit Sitzung.hinzufügen , und dann mit in die Datenbank schreiben Sitzung.commit .

Jetzt fügen wir einen Besitzer hinzu:

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

Dieser Code ist fast identisch mit der vorherigen Einfügung für die Autos Modell. Der Hauptunterschied hier ist, dass auto_id ist ein Fremdschlüssel und benötigt daher eine Zeilen-ID, die in der anderen Tabelle vorhanden ist. Der Zugriff erfolgt über die auto1.id Eigentum.

Sie müssen die Datenbank nicht abfragen oder IDs zurückgeben, da SQLAlchemy dies für Sie übernimmt (sofern Sie die Daten zuerst festschreiben).

Daten lesen

Nachdem Sie einige Daten geschrieben haben, können Sie mit dem Zurücklesen beginnen. So fragen Sie die ab Autos und Autobesitzer Tabellen:

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

So einfach ist das. Durch die Verwendung der Anfrage Methode gefunden in der Sitzung , geben Sie das Modell an und verwenden Sie dann die alle -Methode, um alle Ergebnisse abzurufen. Wenn Sie wissen, dass es nur ein Ergebnis geben wird, können Sie die Erste Methode:

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

Nachdem Sie das Modell abgefragt und Ihre zurückgegebenen Ergebnisse in einer Variablen gespeichert haben, können Sie über das Objekt auf die Daten zugreifen:

print(result[0].color)

Dies druckt die Farbe 'Silber', da dieser Datensatz die erste Zeile ist. Sie können das Ergebnisobjekt durchschleifen, wenn Sie möchten.

Da Sie die Beziehung in Ihrem Modell definiert haben, ist es möglich, auf Daten in verwandten Tabellen zuzugreifen, ohne einen Join anzugeben:

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

Dies funktioniert, weil Ihr Modell Details Ihrer Tabellenstruktur enthält und die Wagen Attribut wurde als Link zum Autos Tisch.

Was ist an ORMs nicht zu mögen?

In diesem Tutorial wurden nur die Grundlagen behandelt, aber sobald Sie den Dreh raus haben, können Sie mit den fortgeschrittenen Themen fortfahren. ORMs haben einige potenzielle Nachteile:

  • Sie müssen Ihr Modell schreiben, bevor Abfragen ausgeführt werden können.
  • Es ist eine weitere neue Syntax, die es zu lernen gilt.
  • Für einfache Anforderungen kann es zu komplex sein.
  • Sie müssen zu Beginn über ein gutes Datenbankdesign verfügen.

Diese Probleme sind an sich kein großes Problem, aber sie sind Dinge, auf die man achten sollte. Wenn Sie mit einer vorhandenen Datenbank arbeiten, können Sie erwischt werden.

Wenn Sie nicht davon überzeugt sind, dass ein ORM das richtige Werkzeug für Sie ist, dann lesen Sie unbedingt über die Wichtige SQL-Befehle, die Programmierer kennen sollten .

Teilen Teilen Tweet Email Sollten Sie sofort auf Windows 11 aktualisieren?

Windows 11 kommt bald, aber sollten Sie so schnell wie möglich aktualisieren oder ein paar Wochen warten? Lass es uns herausfinden.

Weiter lesen
Verwandte Themen
  • Programmierung
  • Python
  • SQL
  • Codierungs-Tutorials
Über den Autor Joe Coburn(136 veröffentlichte Artikel)

Joe hat einen Abschluss in Informatik an der University of Lincoln, Großbritannien. Er ist ein professioneller Softwareentwickler und wenn er nicht gerade Drohnen fliegt oder Musik schreibt, ist er oft beim Fotografieren oder Videoproduzieren anzutreffen.

kann nicht auf Taskleiste klicken Windows 10
Mehr von Joe Coburn

Abonniere unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um sich zu abonnieren