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

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

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

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

Was ist ein ORM??

Objektrelationales Mapping (ORM) ist eine Programmiertechnik, die für den Zugriff auf eine Datenbank verwendet wird. Ihre Datenbank wird in einer Reihe von Objekten angezeigt. 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.

Das hört sich komplex und unnötig an, kann jedoch viel Zeit sparen und den Zugriff auf Ihre Datenbank kontrollieren.

Hier ist ein Beispiel. Angenommen, Sie möchten jedes Mal, wenn Sie ein Kennwort in Ihre Datenbank einfügen, ein Hashing durchführen, wie in Website-Kennwortsicherheit erläutert. Jede sichere Website wird mit Ihrem Kennwort verwendet. Jede sichere Website mit Ihrem Kennwort. Haben Sie sich jemals gefragt, wie Websites Ihr Kennwort vor Daten schützen Verstöße? Weiterlesen . Dies ist kein Problem für einfache Anwendungsfälle - Sie müssen die Berechnung vor dem Einfügen durchführen. Was aber, wenn Sie an vielen Stellen im Code einen Datensatz einfügen müssen? Was ist, wenn ein anderer Programmierer in Ihren Tisch einfügt und Sie nichts davon wissen?

Durch Verwendung eines ORM können Sie Code schreiben, um sicherzustellen, dass wann immer und wo immer auf Zeilen oder Felder in Ihrer Datenbank zugegriffen wird, der andere benutzerdefinierte Code zuerst ausgeführt wird.

Dies wirkt auch als “einzige Quelle der Wahrheit”. Wenn Sie eine benutzerdefinierte Berechnung ändern möchten, müssen Sie sie nur an einer Stelle ändern, nicht an mehreren. Viele dieser Prinzipien können mit der objektorientierten Programmierung (OOP) in Python durchgeführt werden. Einsteigerhandbuch für Python Objektorientiertes Programmieren Einsteigerhandbuch für Python Objektorientiertes Programmieren Um die Stärken von Python voll ausnutzen zu können, sollten Sie wissen, wie Python arbeitet mit objektorientierter Programmierung (OOP). Weitere Informationen, aber ORMs arbeiten mit den OOP-Prinzipien zusammen, um den Zugriff auf eine Datenbank zu steuern.

Es gibt bestimmte Dinge, auf die Sie achten sollten, wenn Sie ein ORM verwenden, und es gibt Umstände, unter denen Sie möglicherweise kein ORM verwenden möchten, aber sie werden im Allgemeinen als eine gute Sache betrachtet, besonders in einer großen Codebasis.

ORMs in Python mit SQLAlchemy

Wie viele Aufgaben in Python ist das Importieren eines Moduls schneller und einfacher als das Erstellen eigener Aufgaben. Natürlich ist es möglich, einen eigenen ORM zu schreiben, aber warum das Rad neu erfunden werden?

In den folgenden Beispielen wird SQLAlchemy verwendet, ein beliebter Python-ORM. Viele Prinzipien gelten jedoch unabhängig von der Implementierung.

Einrichten von Python für SQLAlchemy

Bevor Sie sofort loslegen können, müssen Sie Ihren Computer für die Python-Entwicklung mit SQLAlchemy einrichten.

Sie müssen Python 3.6 verwenden, um diesen Beispielen folgen zu können. Während ältere Versionen funktionieren, muss der folgende Code geändert werden, bevor er ausgeführt werden kann. Nicht sicher über die Unterschiede? Unsere Python-FAQ Die am häufigsten gestellten Fragen zur Python-Programmierung Die am häufigsten gestellten Fragen zur Python-Programmierung In diesem Artikel erfahren Sie alles, was Sie über Python als Anfänger wissen müssen. Mehr lesen deckt alle Unterschiede ab.

Vor dem Programmieren sollten Sie eine Python-Umgebung einrichten. Informationen zur Verwendung der virtuellen Python-Umgebung. Informationen zur Verwendung der virtuellen Python-Umgebung. Egal, ob Sie ein erfahrener Python-Entwickler sind oder gerade erst anfangen, Sie müssen wissen, wie Sie eine virtuelle Umgebung einrichten für jedes Python-Projekt. Lesen Sie mehr, um Probleme mit anderen importierten Python-Paketen zu vermeiden.

Vergewissern Sie sich, dass Sie über PIP und den Python-Paketmanager verfügen. So installieren Sie PIP für Python unter Windows, Mac und Linux. So installieren Sie PIP für Python unter Windows, Mac und Linux viel einfacher und schneller. So installieren Sie PIP Lesen Sie mehr installiert, das in den meisten modernen Python-Versionen enthalten ist.

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

pip install SQLAlchemy-1.2.9

Das 1.2.9 ist die Versionsnummer. Sie können dies deaktivieren, um das neueste Paket zu erhalten, es ist jedoch ratsam, genau zu sein. Sie wissen nicht, wann eine neue Version Ihren aktuellen Code beschädigen kann.

Jetzt können Sie mit der Codierung beginnen. Möglicherweise müssen Sie Ihre Datenbank für die Annahme einer Python-Verbindung vorbereiten. In den folgenden Beispielen wird jedoch eine im Speicher erstellte SQLite-Datenbank verwendet.

Modelle in SQLAlchemy

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

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

von sqlalchemy importieren create_engine von sqlalchemy.ext.declarative import declarative_base Base = declarative_base () engine = create_engine ('sqlite: //') # Datenbank im Speicher erstellen Base.metadata.create_all (engine) # Alle Tabellen in der Datenbank erstellen 

Dieser Code führt mehrere Dinge aus. 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 es konfiguriert alle neuen Modelle so, dass sie wie erwartet funktionieren.

Das create_engine Methode erstellt eine neue Verbindung zu Ihrer Datenbank. Wenn Sie bereits über eine Datenbank verfügen, müssen Sie dies ändern sqlite: // zu Ihrer Datenbank-URI. Bei diesem Code wird eine neue Datenbank nur im Arbeitsspeicher erstellt. Die Datenbank wird zerstört, sobald die Ausführung des Codes abgeschlossen ist.

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

Lass uns ein Modell machen. Fügen Sie einen weiteren Import oben in Ihre Datei ein:

von sqlalchemy import Column, Integer, String

Dies importiert die Säule, Ganze Zahl, und String Module von SQLAlchemy. Sie definieren, wie die Datenbanktabellen, Felder, Spalten und Datentypen funktionieren.

Unter der declarative_base, Erstellen Sie Ihre Modellklasse:

Klasse Cars (Basis): __tablename__ = 'cars' id = Spalte (Integer, primary_key = True) make = Spalte (String (50), nullable = False) color = Spalte (String (50), nullable = False)

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

Jede Klasse muss erben Base. Der Name Ihrer Datenbanktabelle ist in definiert __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, das zu erstellen Ich würde Spalte als Primärschlüssel.

Fügen Sie einen letzten Import hinzu, diesmal für den Unbekannter Schlüssel Modul. Fügen Sie dies neben Ihrem hinzu Säule einführen:

von sqlalchemy import Column, ForeignKey, Integer, String

Erstellen Sie nun eine zweite Modellklasse. Diese Klasse wird aufgerufen Autobesitzer, und speichert die Besitzerdetails bestimmter Fahrzeuge, die in Autos Tabelle:

Klasse CarOwners (Basis): __tablename__ = 'carowners' id = Spalte (Integer, primary_key = True) name = Spalte (String (50), nullable = False) age = Spalte (Integer, nullable = False) car_id = Spalte (Integer, ForeignKey ('cars.id')) car = Beziehung (Autos)

Hier wurden einige neue Attribute eingeführt. Das car_id Feld ist als Fremdschlüssel definiert. Es ist mit dem verbunden Ich würde in dem Autos Tabelle. Beachten Sie, wie der Name der Tabelle in Kleinbuchstaben verwendet wird, statt des Klassennamens.

Zum Schluss noch ein Attribut von Auto ist als a definiert Beziehung. Dies ermöglicht Ihrem Modell den Zugriff auf Autos Tabelle durch diese Variable. Dies wird im Folgenden gezeigt.

Wenn Sie diesen Code jetzt ausführen, werden Sie feststellen, dass nichts passiert. Das liegt daran, dass Sie noch nichts gesagt haben, um etwas zu bemerken.

Objekte in SQLAlchemy

Nachdem Ihre Modelle erstellt wurden, können Sie mit dem Zugriff auf die Objekte und dem Lesen und Schreiben von Daten beginnen. Es ist eine gute Idee, Ihre Logik in eine eigene Klasse und Datei zu integrieren, aber für den Moment kann sie neben den Modellen bleiben.

Daten schreiben

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 dennoch sehr nützlich zu wissen, wie Daten eingefügt werden.

Sie können an das Schreiben gewöhnt sein EINFÜGEN Anweisungen in SQL. SQLAlchemy übernimmt dies für Sie. So fügen Sie eine Zeile in das ein Autos Modell. Beginnen Sie mit einem neuen Import für Sessionmaker:

von sqlalchemy.orm importieren Sie Sessionmaker

Dies ist erforderlich, um das zu erstellen Session und DBSession Objekte, die zum Lesen und Schreiben von Daten verwendet werden:

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

Nun lege das unter deine create_all Aussage:

car1 = Autos (Marke = "Ford", Farbe = "Silber") session.add (car1) session.commit ()

Lassen Sie uns diesen Code aufschlüsseln. Die Variable car1 ist als Objekt definiert, das auf dem basiert Autos Modell. Marke und Farbe werden als Parameter festgelegt. Das ist wie gesagt “mache mir ein Auto, schreibe es aber noch nicht in die Datenbank”. Dieses Auto ist im Speicher vorhanden, wartet jedoch darauf, geschrieben zu werden.

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

Nun fügen wir einen Besitzer hinzu:

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

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

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

Daten lesen

Nachdem Sie einige Daten geschrieben haben, können Sie sie wieder lesen. So fragen Sie das ab Autos und Autobesitzer tische:

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

So einfach ist das. Mit der Abfrage Methode gefunden in der Session, Sie geben das Modell an und verwenden dann die alles Methode, um alle Ergebnisse abzurufen. Wenn Sie wissen, dass es nur ein Ergebnis geben wird, können Sie das verwenden zuerst Methode:

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

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

drucken (Ergebnis [0] .color)

Dies druckt die Farbe “Silber-”, da dieser Datensatz die erste Zeile ist. Sie können das Ergebnisobjekt übergehen, wenn Sie möchten.

Wenn Sie die Beziehung in Ihrem Modell definiert haben, können Sie auf Daten in verknüpften Tabellen zugreifen, ohne einen Join anzugeben:

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

Dies funktioniert, weil Ihr Modell Details zu Ihrer Tabellenstruktur enthält und die Auto Attribut wurde als Link zum definiert Autos Tabelle.

Was ist an ORMs nicht zu mögen??

Dieses Tutorial befasste sich nur mit den Grundlagen, aber sobald Sie sich damit auskennen, können Sie die fortgeschrittenen Themen weiterführen. Es gibt einige potenzielle Nachteile von ORMs:

  • Sie müssen Ihr Modell schreiben, bevor Abfragen ausgeführt werden können.
  • Es ist eine weitere neue zu erlernende Syntax.
  • Für einfache Bedürfnisse kann es zu komplex sein.
  • Sie müssen über ein gutes Datenbankdesign verfügen, um zu beginnen.

Diese Probleme sind zwar kein großes Problem, aber es gibt Dinge, auf die Sie achten sollten. Wenn Sie mit einer vorhandenen Datenbank arbeiten, werden Sie möglicherweise erwischt.

Wenn Sie nicht überzeugt sind, dass ein ORM das richtige Werkzeug für Sie ist, sollten Sie sich über die wichtigsten SQL-Befehle informieren, die Programmierer kennen sollten Die Website verwendet in gewisser Weise eine Datenbank, und in Kombination mit SQL (Structured Query Language) sind die Möglichkeiten zur Bearbeitung von Daten wirklich unbegrenzt. Weiterlesen .

Erfahren Sie mehr über: Codierungs-Tutorials, Python, SQL.