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.
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
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. –
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