SQLAlchemy,一对多,多对一

时间:2010-04-12 09:55:25

标签: sqlalchemy

我有以下数据:

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

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

和一个基本上有书籍(bookID,名称,......)但没有groupID的书桌。我无法确定插入图书时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是group的实例,b是book的实例。

1 个答案:

答案 0 :(得分:0)

userlist=False传递给relation(),表示该属性应代表标量值,而非集合。这将独立于是否存在此列的主键,但您可能还是想要定义唯一约束。