Двунаправленное отношение «один к одному» SQLAlchemy вызывает «RuntimeError: максимальная глубина рекурсии» - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть две модели sqlalchemy db, которые должны отражать двусторонние отношения один-к-одному. Каждый раз, когда я пытаюсь присвоить связанный объект другому, объект возвращает ошибку: *** RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python

Двунаправленная связь создается через db.relationship с параметрами back_populations и uselist = False. uselist = False упоминается в документации по SQLAlchemy для отношений один к одному.

Используемые версии: Колба-SQLAlchemy == 2.3.2 SQLAlchemy == 1.2.14

Я пытался найти любую информацию, связанную с этим, однако ни в Google, ни на этом форуме я не смог найти что-то, что решило бы мою проблему. Единственное решение, которое до сих пор работало, это удаление двунаправленных отношений, чтобы связанный объект был доступен только на одной стороне.

Кроме того, я попытался поиграться с настройками / переданными параметрами метода отношений, но ничего не улучшило поведение.

Модели базы данных:

########################################################
# Event Model
########################################################
class Event(db.Model):
    """Event: event entry, can either be the main object or a child. The difference
    can be detected depending whether a parent_event_id exists or not. If the event
    is recurring a recurring_pattern entry exists. """

    __tablename__ = 'event'
    id = db.Column(db.Integer, primary_key=True) #primary_key


    ... some declarations...


    #relationship to recurring_pattern
    recurring_pattern = db.relationship(
        "Recurring_pattern",
        back_populates="event", #do not populate back
        uselist=False)



########################################################
# Shift_event Model
########################################################
class Recurring_pattern(db.Model):
    """recurring_pattern: is assigned 1:1 to event.
    Stores recurring pattern of event..."""
    __tablename__ = 'recurring_pattern'
    id = db.Column(db.Integer, primary_key=True) #primary_key

    #foreign_key: event_id
    event_id = db.Column(db.Integer, db.ForeignKey('event.id'))
    #relationship to event 1:1
    event = db.relationship(
        "Event",
        back_populates="recurring_pattern")

Код, где происходит ошибка / назначены связанные объекты:

from app.models import Event, Recurring_pattern

...some code...


event = Event()
#set remaining parameters
event.org_id = org_id
event.event_title = event_title
event.event_description = event_description
event.start_date = start_date
event.end_date = end_date
event.duration_days = duration_days
event.duration_hours = duration_hours
event.duration_minutes = duration_minutes
event.shift_type = shift_type
event.break_time_hours = break_time_hours
event.break_time_minutes = break_time_minutes
event.is_full_day_event = is_full_day_event
event.is_recurring = is_recurring
event.created_by = self.user.get_email()


recurring_pattern = Recurring_pattern()
recurring_pattern.set_rrule(rrule_obj)

event.recurring_pattern = recurring_pattern

В момент, когда выполняется event.recurring_pattern = recurring_pattern, объект события содержит только: *** RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python

Ожидаемым результатом будет присвоение событию recurring_pattern. Сохранение / запись объекта в БД с ошибкой невозможна.

Любая помощь или подсказка, чтобы решить это высоко ценится!

...