Принимая во внимание взаимосвязь «многие ко многим» (sqlalchemy, python), как избежать добавления дубликатов? - PullRequest
1 голос
/ 02 июля 2011

Таблицы authors и books находятся во многих отношениях.Книга может иметь много авторов.Автор, возможно, написал много книг.

author_1 = Author('Dan')
session.add(author_1)
author_1.books = [Paper('Illuminati'), Book('Sacrileg')]
session.commit()

Это добавляет две книги и автора в базу данных и связывает их.Пока все хорошо.оба столбца (authors.name и books.title) в разных таблицах уникальны.

Давайте добавим нового автора, и давайте предположим, что Дан помогал писать Иллюминаты .

author_2 = Author('Brownie')
session.add(author_2)
author_2.books = [Paper('Illuminati')]
session.commit()

Это приводит к дублированию ошибки!Это почему?Должен ли я сначала запросить Paper('Illuminati')?Что если у меня будет целый список книг?Должен ли я запросить каждый из них?Или есть автоматическая функция, как sqlalchemy может определить, существует ли уже запись и просто ссылка на нее?

1 Ответ

2 голосов
/ 04 июля 2011

Это в основном длинная версия комментария @renatopp

Это приводит к дублированию ошибки! Почему это так?

Вы создаете новую книгу / бумагу, похожую на ту, что у вас есть в БД. Я так понимаю, вы установили бумагу / книгу name с уникальным ограничением

Должен ли я сначала запросить бумагу («Иллюминаты»)?

Посмотрим, что вы сказали раньше

Давайте добавим нового автора, и давайте предположим, что Дэн помогал в написании иллюминатов.

Этот новый автор помогает Дэну написать Иллюминаты . Те же иллюминаты, которые уже есть на БД. Ваш код там означает «Брауни пишет новую книгу с таким же названием, как у Дэна». Итак, есть две книги, следовательно, ошибка дублирования.

Если вы хотите, чтобы «Брауни помогал Дэну», вы должны заставить его написать ту же самую книгу. Возьмите Иллюминатов Дэна из БД и скажите Брауни, чтобы они помогли Дэну.

    # illuminati = Dan's book from db
    author_2.books.append(illuminati)

Я меняю код там. Поправьте меня, если я ошибаюсь, я думаю, что вы имели в виду добавить книгу к Брауни, а не удалять все его книги и потом дать ему книгу (author_2.books = [Paper('Illuminati')])

Что если бы у меня был целый список книг? Должен ли я запросить каждый из них?

Это зависит. Это все новые книги? Или существующие книги? Может быть, только некоторые из них новые? Или ты вообще не знаешь?

Вам придется проверить их или попробовать поймать исключение

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