gpt4 book ai didi

python - 不同包中的 SQLAlchemy InvalidRequestError

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:37 34 4
gpt4 key购买 nike

我在单独的包中有 3 个文件,如下所示:

-- base
| - class BaseDb(db.Model)
|
-- pkg1
| - class A(BaseDb)
|
-- pkg2
| - class B(BaseDb)

where db is initialized as: db = SQLAlchemy(app) in some other __init__.py

class A(BaseDb):
__tablename__ = "a"
x = relationship("B", back_populates="y")

class B(BaseDb):
__tablename__ = "b"
y = relationship("A", back_populates="x")

显示以下错误:

sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class A->x'. Original exception was: When initializing mapper mapped class Loan->loans, expression 'B' failed to locate a name ("name 'B' is not defined"). If this is a class name, consider adding this relationship() to the <class 'A'> class after both dependent classes have been defined

当所有 BaseDb、A 和 B 都定义在同一个包中时,这可以正常工作,因此关系也可以。许多较旧的帖子建议使用 declarative_base,但这也是在初始化 Model 时由 SQLAlchemy 在其 init 中显式调用的。

据我了解,抛出此错误是因为执行 A 时尚未加载 B。关于如何让它发挥作用有什么想法吗?我想避免将它们全部放在同一个包中,以实现更好的模块化。

最佳答案

这不是由于“执行 A”,而是由于在模型全部加载之前使用了模型(在查询中)。使用它们会触发 mapper configuration 。确保所有模型在第一次使用之前加载的一种方法是让父模块/包(pkg1pkg2)导入所有模型在其 __init__.py 中,因此当您导入一个模型时,它们都会被拉入。

关于python - 不同包中的 SQLAlchemy InvalidRequestError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59091760/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com