我在 SQLAlchemy 中遇到循环导入问题。
我有两个文件 foo.py 和 bar.py。 foo.py 定义了一个 SQLAlchemy 类 Foo,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,但在 mypy(和其他类型检查工具)评估您的代码时为 True
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')