- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在从事一个涉及框架 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/
我目前正在从事一个涉及框架 flask 和 sqlalchemy 的项目。基本思想是拥有一个票务系统,提供不同种类的票证。 我的代码的简化版本可以在这里找到:https://github.com/Bi
我是一名优秀的程序员,十分优秀!