gpt4 book ai didi

python - flask_sqlalchemy : AbstractConcreteBase not mapped until subclass is queried

转载 作者:行者123 更新时间:2023-11-28 17:23:40 26 4
gpt4 key购买 nike

我目前正在从事一个涉及框架 flask 和 sqlalchemy 的项目。基本思想是拥有一个票务系统,提供不同种类的票证。

我的代码的简化版本可以在这里找到:https://github.com/Birne94/flask-sqlalchemy-ticket-setup (可通过 python app.py 运行)。

设置涉及一组模型,它们是:

  • Base:所有模型的基类,基本上只是定义了一个id。和表名

    • TimestampMixin:用于向模型添加时间戳的混合,例如创建或更新时间戳

    • Ticket:我目前遇到麻烦的主要原因。各种门票的抽象基类。

    • TestTicket:一些用于演示目的的票证类

我遇到的当前问题如下:

尝试查询 Ticket 时类,我会收到如下错误:

sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got '<class 'models.Ticket'>'

完整堆栈跟踪:https://gist.github.com/Birne94/bac3254163c8248df192521729857641

我对我的设置进行了很多试验,但没有成功。随机地,我尝试在初始查询之前向子类添加一个查询,并且成功了。

深入研究代码后,似乎在查询子类时首先配置了映射器。查询基类时不会发生这种情况。

这在我上面链接的示例中进行了演示(app.py,第 15 行)。如果我访问端点,第一个查询将失败。在执行第二个查询(有效)后,最初失败的查询现在将有效:

query failed
query successful on second try
127.0.0.1 - - [25/Oct/2016 14:42:22] "GET / HTTP/1.1" 200 -

现在...是否有明显的我遗漏/做错的事情,或者在 SQLAlchemy 中配置映射器是否存在实际问题?

提前致谢!

最佳答案

如果您从 AbstractConcreteBase 继承,它将推迟为该基类创建 Mapper 对象。

在调用 configure_mappers 之前,不会配置内部映射关系。 configure_mappers 的调用点包括将映射类实例化为实例时,以及使用 Session.query() 方法时。

此外,由于您从 AbstractConcreteBase 继承,因此不会对持久表进行任何映射,并且永远不会直接实例化 Ticket 类。因此,在您第一次调用Ticket 上的查询时,没有Ticket 表,也没有任何相互映射关系,导致您提到的错误。

当您查询 TestTicket 时——调用 configure_mappers 并创建 inter-mapper 关系,允许您查询 Ticket .

如果您创建实例 TestTicket 而不是查询它,您应该会看到相同的行为,因为此事件也会导致 configure_mappers 被调用。

如果您打算为 Ticket 类创建一个持久表,您应该改为继承自 ConcreteBase

正如您的发现所证明的那样,手动调用 configure_mappers 似乎可以解决这个问题。

关于python - flask_sqlalchemy : AbstractConcreteBase not mapped until subclass is queried,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40240358/

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