30 Stimmen

Wie funktionieren die einfachen SQLAlchemy-Beziehungen?

Ich bin kein Datenbankspezialist, ich kenne nur die Grundlagen, wirklich. Ich habe SQLAlchemy für ein kleines Projekt in die Hand genommen und verwende die deklarative Basiskonfiguration anstelle des "normalen" Weges. Dieser Weg scheint viel einfacher zu sein.

Beim Einrichten meines Datenbankschemas habe ich jedoch festgestellt, dass ich einige Konzepte für Datenbankbeziehungen nicht verstehe.

Wenn ich eine viele-zu-eins-Beziehung hätte, z. B. vor Artikeln von Autoren (wobei jeder Artikel nur von einem einzigen Autor geschrieben werden könnte), würde ich ein author_id Feld in meinem articles Spalte. Aber SQLAlchemy hat dieses ForeignKey-Objekt und eine Beziehungsfunktion mit einem backref kwarg, und ich habe keine Ahnung, was das alles bedeutet.

Ich habe Angst davor, herauszufinden, wie eine Many-to-Many-Beziehung mit einer Zwischentabelle aussieht (wenn ich zusätzliche Daten über jede Beziehung benötige).

Kann mir jemand das entmystifizieren? Gerade jetzt bin ich einrichten, um openID auth für meine Anwendung zu ermöglichen. Also habe ich dies:

from __init__ import Base
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String

class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String, unique=True)
    email = Column(String)
    password = Column(String)
    salt = Column(String)

class OpenID(Base):
    __tablename__ = 'openid'
    url = Column(String, primary_key=True)
    user_id = #?

Ich denke, die ? sollte ersetzt werden durch Column(Integer, ForeignKey('users.id')) aber ich bin mir nicht sicher - und muss ich die openids = relationship("OpenID", backref="users") in der Klasse Benutzer? Wozu? Was macht sie? Was ist ein backref?

46voto

Denis Otkidach Punkte 30334

Ja, Sie brauchen user_id = Column(Integer, ForeignKey('users.id')) o user_id = Column(Integer, ForeignKey('users.id'), nullable=False) wenn sie obligatorisch ist. Dies wird im zugrundeliegenden Datenbankschema direkt in FOREIGN KEY übersetzt, keine Zauberei.

Die einfache Art, eine Beziehung zu deklarieren, ist user = relationship(Users) en OpenID Klasse. Sie können auch Folgendes verwenden users = relationship('OpenID') en Users Klasse. backref ermöglicht es Ihnen, beide Beziehungen mit einer einzigen Deklaration zu deklarieren: Das bedeutet, dass die Rückwärtsbeziehung automatisch in der entsprechenden Klasse installiert wird. Ich persönlich bevorzuge die Verwendung von backref -s nur für selbstreferenzierende Beziehungen. Der Grund dafür ist, dass ich selbstdokumentierten Code mag: Wenn man sich seine Definition ansieht, sieht man alle definierten Eigenschaften, während bei backref müssen Sie andere Klassen durchsuchen (die wahrscheinlich in anderen Modulen definiert sind).

0 Stimmen

Gute Antwort, danke. Ich bin etwas überrascht, dass es so lange gedauert hat und niemand sonst geantwortet hat... Das scheint etwas zu sein, was viele Leute wissen. Na ja :)

4 Stimmen

Das ist eine großartige Antwort, sehr klar. Ich bevorzuge auch selbst dokumentierten Code. In diesem Sinne bietet SQLAlchemy seit 0.5.1 eine Alternative zu backref das ist back_populates . Die Dokumentation enthält weitere Erläuterungen und ein Beispiel: docs.sqlalchemy.org/de/latest/orm/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X