web.py 使用 db.select 返回的数据只能遍历一次

发布于 2022-08-24 01:13:31 字数 880 浏览 9 评论 0

遍历完后就变空了,这是为什么呢?
例如:

db = web.database(dbn='sqlite', db='data.db') #设置数据库连接
q = db.select('customer_order', order='id DESC') #返回数据

得到结果后,查询q[1]返回

<Storage {'customer_name': u'\u5e7f\u4e49', 'update_time': None, 'create_time': u'2012-03-05 22:44:07.428652', 'description': u'nice', 'id': 4}>

再查询q[1]返回

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "web/utils.py", line 669, in __getitem__
    raise IndexError, "already passed "+str(i)
IndexError: already passed 1

web.py 官方的 db.py 的内容 https://github.com/webpy/webpy/blob/m...

请问是什么原因造成的呢,如何解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

诺曦 2022-08-31 01:13:31

Python 中的迭代器本来就是一次性的,无论是生成器表达式还是 yield 都是这样。如果你需要多次使用,应该先用 list 工厂函数将迭代器转换成列表。当然,转换之后迭代器就空了,但是数据保存到了列表中。

笨死的猪 2022-08-31 01:13:31

同学你的数据只有一条呢,是不是应该就是q[0]来获取数据吧!

彼岸花似海 2022-08-31 01:13:31

所以这就是需要ORM的重要性啦
不要直接把DB select的结果返回 而是包装成一个model的Object返回
可以用第三方的 或者简单就自己定义对象和set值
这样就可以避免这种迭代一次的情况,更重要的是,当你这个db方法被很多地方调用的时候,如果要加一点字段,就很恶心了,到处改,封装成model再返回,就只需要改一个地方啦,把修改集中。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文