如何在 SQLAlchemy 中处理循环导入

问题描述 投票:0回答:1

我在 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["..."]
将引发“...”的未定义错误

python sqlalchemy circular-dependency
1个回答
0
投票

你可以使用 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')
© www.soinside.com 2019 - 2024. All rights reserved.