SqlAlchemy избегать циклических зависимостей в ORM без использования строк - PullRequest
0 голосов
/ 19 декабря 2018

Есть ли способ быть более явным в определениях SqlAlchemy ORM, используя ссылки на класс / член вместо строковых констант, не сталкиваясь с циклическими зависимостями?Одним из главных преимуществ ORM является поддержание чистоты и удобства обслуживания, чем копирование строковых констант повсюду.Это полностью подрывает эту выгоду.

Простой пример из документации SqlAlchemy, показывающий использование строковых констант.

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

Я хочу сделать это:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship(Child)

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey(Parent.id))

Этокак правило, законно, но проблема в том, что я сталкиваюсь с циклическими зависимостями с необходимым импортом Parent из Child и Child из Parent (при условии, что они находятся в отдельных файлах).Лучшее, что я могу сделать, это разделить разницу - использовать строки на одном конце и выполнять явный класс с импортом на другом конце.Просто чувствует себя нехорошо.

Просто интересно, не упустил ли я что-то или у кого-то есть какие-то способы сделать это.

1 Ответ

0 голосов
/ 19 декабря 2018

В качестве альтернативы строковым атрибутам, атрибуты также могут быть определены после создания всех классов.Просто добавьте их в целевой класс после факта:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey(Parent.id))

Parent.childen = relationship(Child)
...