2009-05-07 7 views
0

J'ai trouvé un endroit dans mon projet actuel où j'ai créé plusieurs classes pour stocker une structure de données compliquée en mémoire et un schéma SQL complet pour stocker les mêmes données dans un base de données. J'ai décidé d'utiliser SQLAlchemy comme une couche ORM car il semble que ce soit la solution la plus flexible que je puisse adapter à mes besoins. Mon problème est que j'ai maintenant besoin de mapper une table entière à un attribut de tableau en mémoire et j'ai du mal à trouver si cela est possible et, si c'est le cas, comment le faire avec SQLAlchemy. Il est encore possible pour moi de changer les structures de données en code (bien que moins qu'idéales) sinon, mais je préférerais ne pas le faire.Mappage d'une table de base de données à un attribut d'un objet

Le tableau en question est créée en utilisant l'instruction SQL suivante:

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 ; 

Ceci est juste une petite partie de la base de données complète et la même chose va être nécessaire dans plusieurs endroits.

Répondre

1

Il semble que vous voulez quelque chose comme

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

Sinon s'il vous plaît préciser dans votre question.

Idéalement, vous devriez avoir 2 mappages à ces 2 tables. Cela n'a pas d'importance si vous n'accédez pas au second mappage ailleurs. work Le mappage doit avoir une relation un-à-plusieurs avec le mappage variant. Cela vous donnerait une liste de variant instances associées à un work particulier sur n'importe quel attribut que vous définissez votre relation.

+0

Cela ressemble beaucoup à ce que je veux. Y at-il un moyen de le faire sans avoir à avoir une classe python spécifiquement pour les variantes? Ou devrais-je céder et avoir une classe pour chacun de ces éléments malgré leur simplicité? – workmad3

+0

Vous n'avez pas besoin de classe pour SQLAlchemy ORM. Vous pouvez simplement interroger une table sans mappage ORM. Vous pouvez utiliser un fetchall explicite() obtenir toutes les lignes; vous obtenez une liste de dictionnaires. –

+0

S.Lott a raison, vous n'avez pas besoin d'avoir une classe pour chaque table. Mais je les créerais de toute façon. Quelque part dans votre code, vous voudrez opérer sur des variantes et vous pourriez trouver plus pratique d'avoir le mapping que d'attacher la fonctionnalité sur le mapping de travail. – muhuk

Questions connexes