2010-04-12 4 views
0

j'ai les données suivantes:SQLAlchemy, un à plusieurs contre plusieurs à un

CREATE TABLE `groups` (  
    `bookID` INT NOT NULL, 
    `groupID` INT NOT NULL, 

    PRIMARY KEY(`bookID`), 
    KEY(`groupID`) 
); 

et une table de livre qui a essentiellement des livres (bookID, nom, ...), mais sans groupID. Il n'y a aucun moyen pour moi de déterminer ce que le groupID est au moment de l'insertion pour les livres.

Je veux faire cela dans sqlalchemy. Par conséquent, j'ai essayé de mapper le livre aux livres joints avec des groupes sur book.bookID = groups.bookID.

J'ai fait ce qui suit:

tb_groups = Table('groups', metadata, 
    Column('bookID', Integer, ForeignKey('books.bookID'), primary_key=True), 
    Column('groupID', Integer), 
) 

tb_books = Table('books', metadata, 
    Column('bookID', Integer, primary_key=True), 

tb_joinedBookGroup = sql.join(tb_books, tb_groups, \ 
     tb_books.c.bookID == tb_groups.c.bookID) 

et défini le mappeur suivant:

mapper(Group, tb_groups, properties={ 
    'books': relation(Book, backref='group') 
}) 
mapper(Book, tb_joinedBookGroup) 

...

Cependant, quand j'exécute ce morceau de code, je réalise que chaque L'objet livre a un groupe de champs, qui est une liste, et chaque objet de groupe a un champ de livres qui est une affectation singulière. Je pense que ma définition ici a dû faire que sqlalchemy soit confus au sujet de la relation many-to-one vs one-to-many.

Quelqu'un peut-il m'aider à résoudre ce problème?

Mon but recherché est:

g.books = [b, b, b, .. ] 
book.group = g 

où g est une instance de groupe, et b est une instance de livre.

+0

En outre, existe-t-il un moyen de résoudre ce problème si tb_groups.bookID n'est PAS la clé primaire? – crapbag

Répondre

0

Transmettez userlist=False à relation() pour indiquer que cette propriété doit représenter la valeur scalaire et non la collection. Ce sera indépendant si il y a une clé primaire pour cette colonne, mais vous voulez probablement définir une contrainte unique de toute façon.

Questions connexes