由于延迟加载而使用 Pony ORM 的 DatabaseSessionIsOver?

2024-02-07

我正在使用 Pony ORM 作为烧瓶解决方案,并且遇到了以下问题。

考虑以下:

@db_session
def get_orders_of_the_week(self, user, date):
    q = select(o for o in Order for s in o.supplier if o.user == user)
    q2 = q.filter(lambda o: o.date >= date and o.date <= date+timedelta(days=7))
    res = q2[:]

    #for r in res:
    #    print r.supplier.name

    return res

当我需要 Jinja2 中的结果时——看起来像这样

{% for order in res %}
    Supplier: {{ order.supplier.name }}
{% endfor %}

I get a

DatabaseSessionIsOver: Cannot load attribute Supplier[3].name: the database session is over

如果我取消注释for r in res部分,它工作正常。我怀疑有某种延迟加载没有加载res = q2[:]。 我完全错过了一点还是这里发生了什么?


我刚刚添加了预取功能,应该可以解决您的问题。您可以从以下位置获取工作代码GitHub 存储库 https://github.com/ponyorm/pony。此功能将成为即将发布的 Pony ORM 0.5.4 的一部分。

现在你可以写:

q = q.prefetch(Supplier)

or

q = q.prefetch(Order.supplier)

Pony会自动加载相关supplier对象。

下面我将使用带有学生、组和部门的标准 Pony 示例,展示几个带有预取的查询。

from pony.orm.examples.presentation import *

仅加载 Student 对象,不进行任何预取:

students = select(s for s in Student)[:]

将学生与小组和部门一起加载:

students = select(s for s in Student).prefetch(Group, Department)[:]

for s in students: # no additional query to the DB is required
    print s.name, s.group.major, s.group.dept.name

与上面相同,但指定属性而不是实体:

students = select(s for s in Student).prefetch(Student.group, Group.dept)[:]

for s in students: # no additional query to the DB is required
    print s.name, s.group.major, s.group.dept.name

加载学生及其课程(多对多关系):

students = select(s for s in Student).prefetch(Student.courses)

for s in students:
    print s.name
    for c in s.courses: # no additional query to the DB is required
        print c.name

作为参数prefetch()您可以指定实体和/或属性的方法。如果您指定了一个实体,则所有to-one该类型的属性将被预取。如果您指定了一个属性,那么将预取该特定属性。仅当显式指定时才会预取对多属性(如Student.courses例子)。预取是递归进行的,因此您可以加载长链属性,例如student.group.dept.

当预取对象时,默认情况下会加载其所有属性,除了惰性属性和多对多属性之外。如果需要,您可以显式预取惰性属性和多对多属性。

我希望这种新方法能够完全覆盖您的用例。如果某些内容未按预期工作,请在 GitHub 上开始新问题 https://github.com/ponyorm/pony/issues/new。您还可以在以下位置讨论功能并提出功能请求:Pony ORM 邮件列表 http://ponyorm-list.ponyorm.com.

附:我不确定您使用的存储库模式是否能给您带来真正的好处。我认为它实际上增加了模板渲染和存储库实现之间的耦合,因为当模板代码开始使用新属性时,您可能需要更改存储库实现(即向预取列表添加新实体)。与顶级@db_session装饰器,您只需将查询结果发送到模板,一切都会自动发生,无需显式预取。但也许我遗漏了一些东西,所以我有兴趣看到有关在您的案例中使用存储库模式的好处的其他评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于延迟加载而使用 Pony ORM 的 DatabaseSessionIsOver? 的相关文章

随机推荐

  • ReferenceError:“工作表”未定义

    这是我第一次尝试使用脚本编辑器 我被分配编写一个脚本来为谷歌表格创建数据透视表 creating pivot table through script editor for google sheet function addPivotTab
  • 手动安装 Xcode 命令行工具不起作用

    我已经从 Apple 网站手动安装了 Xcode 命令行工具 并且完成了安装过程 但它似乎不起作用 我从终端运行它来查看它是否已安装 Zach Boyette MacBook Pro 2 zachboyette pkgutil pkg in
  • 一个好的数据库建模工具? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将我在提交中更改的行中的空格转换为制表符

    我已经对 git repo 进行了相当大的提交 更改了 60 个文件 插入了 1635 个 删除了 3 个 现在我意识到我使用了空格进行缩进 而其余代码则使用了制表符 因此 我想替换制表符的空格 但仅限于该提交更改的行 因为我不想修改可能使
  • Kube-Proxy-Windows CrashLoopBackOff

    安装过程 我是 Kubernetes 的新手 目前正在 Azure VM 内设置 Kubernetes 集群 我想部署 Windows 容器 但为了实现此目的 我需要添加 Windows 工作节点 我已经部署了一个具有 3 个主节点和 1
  • 通过 Powershell 进行智能图像搜索

    我对按自定义属性搜索文件感兴趣 例如 我想查找具有特定尺寸的所有 JPEG 图像 有些东西看起来像 Get ChildItem Path C Filter jpg Recursive where object Dimension eq 10
  • 同一视图中的普通模型和 IEnumerable 模型

    有一个小问题 我自己解决不了 我想在一个视图中使用相同的模型 但一次使用 IEnumerable 第二次不使用它 My View model IEnumerable
  • Apple Interface Builder:向 UIImageView 添加子视图

    我创建UIImageView在 Interface Bulder 的帮助下 现在我想在其中放置标签 作为其子视图 在代码中我可以输入如下内容 myUIImageView addSubview myUILabel 但我可以在IB的帮助下做到这
  • Java什么时候调用垃圾收集器

    我读了很多关于 Java 堆的文章 我看到如果我们得到 java lang OutOfMemoryError 我们应该增加 Xmx 来解决这个问题 for e g java Xmx2048m Xms256m 这会将 Java 使用的堆内存增
  • 在 Windows 上安装 PG Gem 时出错

    我使用 XAMPP 作为 PostgreSQL 9 3 的安装文件夹 C xampp pgsql 9 3 现在我尝试使用该目录作为参考来安装 PostgreSQL gem gem install pg with pg include C x
  • R 中的“抖动”函数有什么作用?

    根据文档 http astrostatistics psu edu su07 R html base html jitter html 的解释为jitter函数是 向数字向量添加少量噪声 这是什么意思 是否有一个随机数与向量中的每个数字相关
  • 使用 Tkinter 中的按钮终止线程

    在我的 GUI 代码中 我尝试通过单击一个按钮来同时运行循环 1 和循环 2 因此 我用了Thread为了达成这个 但我也尝试通过单击另一个按钮来阻止它 但失败了 在stackoverflow上搜索后发现没有直接杀死的方法Thread 这是
  • Rails 4:f.select 返回字符串而不是整数

    我有用户注册表格 用户必须通过选择选项选择他的国家 地区 当我提交表单时 我收到错误 Country 70309119520500 Expected got String 8039220 请帮助我如何将字符串转换为整数 以便我可以在数据库中
  • OpenGL ES 中使用的 3d 立方体的法线是什么?

    我有一个立方体定义为 float vertices Vertices according to faces 1 0f 1 0f 1 0f Vertex 0 1 0f 1 0f 1 0f v1 1 0f 1 0f 1 0f v2 1 0f 1
  • Visual Studio 2010 中的编程数据断点

    我一直在尝试使用编程数据断点 就像CBreakpoint http www morearty com code breakpoint 例如 通过使用SetThreadContext http msdn microsoft com en us
  • 使用 selenium2library 和 Robot Framework 验证页面中是否存在 2 个文本中的一个文本

    我想测试页面是否包含 TEXT1 或 TEXT2 页面应包含 TEXT1 或 TEXT2 有什么建议我该怎么做 目前我只能检查一篇文本 您可以使用 Page Should Contain Element http rtomac github
  • 列向量与行意味着——与 std::accumulate?

    为了尽可能地懒惰 我在矩阵中读为 vector lt vector
  • 除了动态参数和可选参数之外,C# 4.0 还有哪些新功能?

    所以 C 4 0 昨天出来了 它引入了备受争议的dynamic关键字 命名参数和可选参数 较小的改进是隐含的ref识别 COM 方法上的索引属性和默认属性 逆变和协变 实际上是 NET CLR 功能 不仅仅是 C 以及 真的是这样吗 是dy
  • 找出 Uneaten Leaves 算法错误

    我在面试挑战中遇到了这个问题 K 条毛毛虫正在吃掉 N 片叶子 每条毛毛虫 以独特的顺序从一片叶子落到另一片叶子 所有毛毛虫都开始 在位置 0 处的树枝上 并落在位置之间的叶子上 1 和 N 每条毛毛虫 j 都有一个关联的跳跃数 Aj A
  • 由于延迟加载而使用 Pony ORM 的 DatabaseSessionIsOver?

    我正在使用 Pony ORM 作为烧瓶解决方案 并且遇到了以下问题 考虑以下 db session def get orders of the week self user date q select o for o in Order fo