2010-04-12 146 views
0

,我有以下数据:SQLAlchemy的,一对多VS多对一

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

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

和主要有书籍(BOOKID,姓名,...)一书表,但没有组ID。在插入书籍时,我无法确定groupID是什么。

我想在sqlalchemy中做到这一点。因此,我尝试将Book映射到与book.bookID = groups.bookID上的组加入的书籍。

我作了如下:

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) 

和定义的以下映射器:

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

...

然而,当我执行这一段代码,我意识到,每个书对象具有一个字段组,它是一个列表,而每个组对象都有一个单独的书签字段。我认为我的定义一定是导致sqlalchemy对多对一和一对多的关系感到困惑。

有人可以帮我解决这个问题吗?

我的期望的目标是:

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

其中g是组的实例,并且b是书的一个实例。

+0

另外,如果tb_groups.bookID不是主键,有没有办法解决这个问题? – crapbag 2010-04-12 09:58:23

回答

0

通过userlist=Falserelation()说属性应该代表标量值而不是集合。这将独立于此列是否有主键,但您可能想要定义唯一约束。