Warum braucht es SQLAlchemy?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

BlackJack hat geschrieben:*Eine* Beziehung zu `auth.User` ist ja auch kein Problem, aber bei *zwei* führt das halt zu *zwei* Rückverweisen mit dem *gleichen* generierten Namen. An der Stelle muss man bei mindestens einer Beziehung manuell einen Namen für den Rückverweis geben. Am besten aber beiden, weil der automatisch generierte nicht wirklich gut die Beziehung ausdrückt. Oder man gibt an das gar keine Rückrichtung existieren soll, das geht natürlich auch.
@blackjack: Ich dachte mir das so:

Bild

Empfänger: user_id 1
Sender: user_id 3

Wozu benötigt man den related_name?

@DasIch: Danke, ich lasse die Bezeichnungen besser einmal drin. Ich verwende das Tutorial um mein Modell in Django zu transferieren.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: Du willst vielleicht nicht nur von einer Nachricht wissen, wer sie geschickt hat, sondern von einem Member wissen, welche Nachrichten er alle geschickt hat. Daher gibt es Rückreferenzen. Die werden nicht im Datenbankschema als Felder abgebildet, sondern sind rein logisch. Django generiert automatisch eine Rückreferenz mit dem Namen der Ursprungstabelle. Wenn es aber zwei Rückreferenzen gibt, kann Django keinen automatisch (doppelt vergebenen) Namen vergeben.
BlackJack

@meego: Wenn man zwei Entitäten in Beziehung setzt hat diese Verbindung ja keine Richtung. Du gibst nur bei einer Klasse die Beziehung an, aber die Rückrichtung kann man ja auch abfragen. Und zwar auf den anderen Objekten über den `related_name`. Gehen wir mal davon aus das die Klasse für die Nachrichten `Message` heisst, dann wären die über das Attribut `messages` auf den `Member`-Objekten verfügbar, zumindest wenn es nur `sender` oder nur `receiver` gäbe. Wenn es beide gibt, dann gibt's genau das Problem aus der Fehlermeldung: es können nicht beide Rückrichtungen den gleichen Namen haben.

Die Tabellennamen sollten eher Einzahl sein, also `message` und `country`, denn genau wie eine Klasse beschreibt wie *ein* Exemplar aussieht beschreibt die Tabellendefinition wie *ein* Datensatz aufgebaut ist. Du solltest Dir vielleicht auch anschauen wie die Spaltennamen von Django generiert werden oder gleich einen UML-Entwurf der Modelklassen-Beziehungen erstellen und dort nicht die Spaltennamen sondern die Attributnamen verwenden. Im Moment sieht das entweder gemischt aus, oder Du hast keine einheitliche Namensgebung für Fremdschlüssel-Spalten.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@meego:
Dir ist schon klar, dass das Model `Member` nicht wie von Dir im Diagramm vorgesehen, mit Nachrichten verknüpft ist? Bzw. `Member` keine Beziehung zu `auth.User` hat. Mehr dazu https://docs.djangoproject.com/en/1.8/t ... user-model
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Sirius3 hat geschrieben:@meego: Du willst vielleicht nicht nur von einer Nachricht wissen, wer sie geschickt hat, sondern von einem Member wissen, welche Nachrichten er alle geschickt hat. Daher gibt es Rückreferenzen. Die werden nicht im Datenbankschema als Felder abgebildet, sondern sind rein logisch. Django generiert automatisch eine Rückreferenz mit dem Namen der Ursprungstabelle. Wenn es aber zwei Rückreferenzen gibt, kann Django keinen automatisch (doppelt vergebenen) Namen vergeben.
@Sirius: Danke für die gute und schlichte Erklärung. Gibt es da eine Konvention zur Benennung?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@blackjack:
BlackJack hat geschrieben:@meego: Wenn man zwei Entitäten in Beziehung setzt hat diese Verbindung ja keine Richtung. Du gibst nur bei einer Klasse die Beziehung an, aber die Rückrichtung kann man ja auch abfragen. Und zwar auf den anderen Objekten über den `related_name`. Gehen wir mal davon aus das die Klasse für die Nachrichten `Message` heisst, dann wären die über das Attribut `messages` auf den `Member`-Objekten verfügbar, zumindest wenn es nur `sender` oder nur `receiver` gäbe. Wenn es beide gibt, dann gibt's genau das Problem aus der Fehlermeldung: es können nicht beide Rückrichtungen den gleichen Namen haben.
Das ist mir jetzt klar. Das hier
Du solltest Dir vielleicht auch anschauen wie die Spaltennamen von Django generiert werden oder gleich einen UML-Entwurf der Modelklassen-Beziehungen erstellen und dort nicht die Spaltennamen sondern die Attributnamen verwenden. Im Moment sieht das entweder gemischt aus, oder Du hast keine einheitliche Namensgebung für Fremdschlüssel-Spalten.
Habe ich nicht ganz verstanden. Beüglich der Namensgebung, bin ich etwas gespalten, ob man da nicht besser eine einprägsame Bezeichnung eintippt (sender/receiver).
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

jerch hat geschrieben:@meego:
Dir ist schon klar, dass [..] `Member` keine Beziehung zu `auth.User` hat. Mehr dazu https://docs.djangoproject.com/en/1.8/t ... user-model
@Jerch: Ja, das war mir schon klar. Mal sehen, wie gut ich das verstehe. Danke für den Link.
BlackJack

@meego: Du hast bei Deinen Spaltennamen für Fremdschlüssel mal Namen ohne Zusatz (`sender`), mal mit `id_`-Präfix und mal mit `_id`-Postfix. Ich würde an der Stelle den Datenbankentwurf mit dem ORM machen, denn Django hat da ja Konventionen wie die Spaltennamen zu den Attributen aussehen. Entweder hält man sich da dran oder man muss dann extra immer noch mal angeben wie das Attribut in der Datenbank heisst.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

BlackJack: Django hängt bei den Spalten "_id" für ForeignKeys automatisch an. Hast du das gemeint?
Und du meinst, ich soll gar keine Schemas zeichnen?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@meego:
Die Django-App django-extensions kann Dir aus den Modeldefinitionen auch ein ER-Diagramm zeichnen. Mit einem highly sophisticated ER-Diagramm würde ich nur an Django herantreten, wenn es die Datenlage nicht anders zulässt (z.B. bestehende legacy-DB, komplexe Relationen). Ansonsten würde ich zunächst versuchen, es so weit wie möglich mit den ORM-Boardmitteln abzubilden - das erspart Dir einiges an Kopfzerbrechen später auf Pythonseite. Schwierige oder schlecht mit dem ORM realisierbare Abfragen kannst Du dann immernoch per raw-Queries vornehmen.
BlackJack

@meego: Ich würde bei Verwendung eines ORM, das auch die Tabellen und Spalten erzeugen kann, kein Datenbank-Diagramm erstellen sondern ein Klassendiagramm. Das ist ja letztendlich die Ebene auf der man dann später auch arbeitet.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo ihr beiden,

Ich denke für mich ist es in erster Linie auch ein Stück weit Auslegeordnung. Bloss aus den Klassen heraus kann ich mir manchmal schlecht vorstellen, wie das alles verknüpft werden soll.

Die Membertabelle (User) werde ich wohl erst einmal zurückstellen, weil sie offenbar Migrationsprobleme verursacht, wenn man sie falsch anlegt.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben: Ich denke für mich ist es in erster Linie auch ein Stück weit Auslegeordnung. Bloss aus den Klassen heraus kann ich mir manchmal schlecht vorstellen, wie das alles verknüpft werden soll.
Wenn du ein ORM benutzt, dann solltest du dich halt auch darauf einlassen. Der Sinn des ORM ist ja, dass man sich eben _nicht_ mit der DB befassen musst.

Außerdem kannst du die Beziehungen doch auch im von blackjack vorgeschlagenen Klassendiagramm sehen.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hi
noisefloor hat geschrieben: Außerdem kannst du die Beziehungen doch auch im von blackjack vorgeschlagenen Klassendiagramm sehen.
Was für eine Software (Linux) verwendet ihr da?
BlackJack

@meego: Papier und Bleistift (systemunabhängig!). ;-)
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ein Freund hat mir mal auf Papier gezeigt, wie er von einer Idee über Skizzen zu einem Datenbankmodell kommt. Das war furchtbar einleuchtend und klar, aber online hab ich dazu noch keine guten Anleitungen gefunden.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn male ich auch per Hand. Bei der Konzeptionierung empfinde ich den Overhead einer Software als störend.

Wenn doch per Software gemalt werden soll, dann geht das unter Linux z.B. mit Dia oder Graphviz.

Gruß, noisefloor

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Danke für den Bleistiftipp.

Baut man so ein Portal eigentlich aus kleineren Apps auf oder macht man eine (irgendwie wäre es ja toll, wenn alle Model-Klassen an einem Ort definiert werden)?
Antworten