У меня проблема с циклическим импортом в SQLAlchemy.
У меня есть два файла foo.py и bar.py. foo.py определяет класс Foo SQLAlchemy, а bar.py определяет класс Bar.
И Foo, и Bar являются внешними ключами друг друга, поэтому я сопоставляю их друг другу с помощью Mapped["..."]
, чтобы обеспечить безопасность типов, однако это означает, что мне также нужно импортировать фактические классы.
Это вызывает циклическую ошибку импорта.
Как лучше всего решить эту проблему? Каковы некоторые общие рекомендации по работе с циклическим импортом в SQLAlchemy? Разве вы не можете обеспечить безопасность типов в этом случае, если вы используете отношение двунаправленно?
# foo.py
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from .bar import Bar
class Foo(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True)
bar_id = Column(Integer, ForeignKey('bar.id'))
bar: Mapped["Bar"] = relationship('Bar')
# bar.py
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from .foo import Foo
class Bar(Base):
__tablename__ = 'bar'
id = Column(Integer, primary_key=True)
foo_id = Column(Integer, ForeignKey('foo.id'))
foo: Mapped["Foo"] = relationship('Foo')
Редактировать:
Обратите внимание, что я не могу удалить импорт Bar и Foo, потому что тогда Mapped["..."]
вызовет неопределенную ошибку для "..."
вы можете использовать TYPE_CHECKING. Эта константа имеет значение False во время выполнения, но True, когда mypy (и другие инструменты проверки типов) оценивают ваш код.
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .bar import Bar
else:
Bar = "Bar"
# foo.py
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
class Foo(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True)
bar_id = Column(Integer, ForeignKey('bar.id'))
bar: Mapped[Bar] = relationship('Bar')