2009-05-07 8 views
0

Ich bin in meinem aktuellen Projekt auf einen Bereich gestoßen, in dem ich mehrere Klassen zum Speichern einer komplizierten Datenstruktur im Speicher und ein vollständiges SQL-Schema zum Speichern der gleichen Daten in einem erstellt habe Datenbank. Ich habe mich entschieden, SQLAlchemy als ORM-Schicht zu verwenden, da es die flexibelste Lösung zu sein scheint, die ich an meine Bedürfnisse anpassen kann.Zuordnung einer Datenbanktabelle zu einem Attribut eines Objekts

Mein Problem ist, dass ich jetzt eine ganze Tabelle nur auf ein Array-Attribut im Speicher abbilden muss und mich bemühe, herauszufinden, ob dies möglich ist und, wenn ja, wie man es mit SQLAlchemy macht. Es ist mir immer noch möglich, die Datenstrukturen im Code zu ändern (wenn auch weniger als ideal), wenn nicht, aber das würde ich lieber nicht tun.

Die betreffende Tabelle erstellt wird mit dem folgende SQL:

CREATE TABLE `works` (
`id` BIGINT NOT NULL auto_increment, 
`uniform_title` VARCHAR(255) NOT NULL, 
`created_date` DATE NOT NULL, 
`context` TEXT, 
`distinguishing_characteristics` TEXT, 
PRIMARY KEY (`id`), 
INDEX (`uniform_title` ASC), 
INDEX (`uniform_title` DESC) 
) ENGINE = InnoDB DEFAULT CHARSET = utf8 ; 

CREATE TABLE `variant_work_titles` (
`id` BIGINT NOT NULL auto_increment, 
`work_id` BIGINT NOT NULL, 
`title` VARCHAR(255) NOT NULL, 
PRIMARY KEY(`id`), 
INDEX (`work_id`), 
INDEX (`title` ASC), 
INDEX (`title` DESC), 
FOREIGN KEY (`work_id`) 
    REFERENCES `works` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

Dies ist nur ein kleiner Teil der gesamten Datenbank und dasselbe ist an mehreren Stellen erforderlich sein wird.

Antwort

1

Es scheint, Sie wollen etwas, wie

work_instance.variants = [<some iterable of variants>] 

Wenn nicht bitte in Ihrer Frage klären.

Idealerweise sollten Sie 2 Zuordnungen zu diesen 2 Tabellen haben. Es spielt keine Rolle, wenn Sie nirgendwo anders auf das zweite Mapping zugreifen. work Mapping sollte eine Eins-zu-viele-Beziehung zu variant Mapping haben. Dies würde Ihnen eine Liste von variant Instanzen geben, die mit einem bestimmten work auf dem Attribut verbunden sind, das Sie Ihre Beziehung definieren.

+0

Das klingt so ziemlich wie ich will. Gibt es eine Möglichkeit, dies zu tun, ohne eine Python-Klasse speziell für die Varianten zu haben? Oder sollte ich trotz all ihrer Einfachheit nachgeben und eine Klasse für jedes dieser Elemente haben? – workmad3

+0

Sie benötigen keine Klasse für SQLAlchemy ORM. Sie können nur eine Tabelle ohne ORM-Mapping abfragen. Sie können eine explizite fetchall() verwenden, um alle Zeilen zu erhalten; Sie erhalten eine Liste von Wörterbüchern. –

+0

S.Lott hat Recht, Sie müssen nicht für jede Tabelle eine Klasse haben. Aber ich würde sie trotzdem schaffen. Irgendwo in Ihrem Code werden Sie vielleicht mit Varianten arbeiten, und Sie könnten es einfacher finden, das Mapping zu verwenden, als die Funktionalität beim Work Mapping anzuhängen. – muhuk