SQLAlchemy, один ко многим против многих к одному - PullRequest
0 голосов
/ 12 апреля 2010

У меня есть следующие данные:

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

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

и таблица книг, в которой в основном есть книги (bookID, name, ...), но БЕЗ 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 - это экземпляр группы, а b - это экземпляр книги.

1 Ответ

0 голосов
/ 12 апреля 2010

Передайте userlist=False в relation(), чтобы указать, что свойство должно представлять скалярное значение, а не коллекцию. Это будет зависеть от того, есть ли первичный ключ для этого столбца, но вы все равно, возможно, захотите определить уникальное ограничение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...