无法使用 web2py 的 DAL 写入 AppEngine DataStore

发布于 2024-12-10 01:08:49 字数 1061 浏览 1 评论 0 原文

我刚刚开始将 web2py 与 Google AppEngine 一起用于我的应用程序。由于某种原因,我无法使用 DAL 保存/检索数据。这是我正在使用的代码:

在 db.py 的末尾:

from aeoid import middleware
from aeoid import users
import json


db.define_table('files', 
                    db.Field('name', 'text'),
                    db.Field('path', 'text'),
                    db.Field('version', 'text', default="live"),
                    db.Field('hash', 'text'),
                    db.Field('data', 'text'),
                    db.Field('meta', 'text', default=json.dumps({'date':str(request.now)})),
                    db.Field('contributors', 'text', default=json.dumps([users.get_current_user()])),
                    db.Field('lasttime', 'datetime', default=request.now)
                )

在我的控制器中:

name = "TEST"
db.files[0] = dict(hash=name, name=name, path=name)
textobj = db.files[1]
if textobj is None:
  print "Fail: 500 Internal Server Error"

这里,由于某种原因,textobj 始终为 None 。

我做错了什么?

编辑:我在 Windows 上使用 AppEngine SDK for Python。

I've just started using web2py with Google AppEngine for an app of mine. For some reason, I'm unable to save/retrieve data using the DAL. Here's the code I'm using:

At the end of db.py:

from aeoid import middleware
from aeoid import users
import json


db.define_table('files', 
                    db.Field('name', 'text'),
                    db.Field('path', 'text'),
                    db.Field('version', 'text', default="live"),
                    db.Field('hash', 'text'),
                    db.Field('data', 'text'),
                    db.Field('meta', 'text', default=json.dumps({'date':str(request.now)})),
                    db.Field('contributors', 'text', default=json.dumps([users.get_current_user()])),
                    db.Field('lasttime', 'datetime', default=request.now)
                )

In my controller:

name = "TEST"
db.files[0] = dict(hash=name, name=name, path=name)
textobj = db.files[1]
if textobj is None:
  print "Fail: 500 Internal Server Error"

Here, textobj is always None for some reason.

What am I doing wrong?

EDIT: I'm using AppEngine SDK for Python on Windows.

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

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

发布评论

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

评论(1

无畏 2024-12-17 01:08:49

使用 快捷语法 db.table[id],id指的是记录ID。 db.table[0] 实际上并不引用现有记录——它只是用于插入新记录。
另外,在 GAE 上,记录 ID 不会从 1 开始并以 1 递增,因此您的第一个插入记录不会具有 ID=1。您可以执行以下操作:

textobj = db(db.files).select().first()

textobj_id = db.files.insert(hash=name, name=name, path=name)
textobj = db.files[textobj_id]

最后,在部署到 GAE 之前,请确保您已使用 GAE SDK 应用程序服务器在本地运行应用程序,以便正确生成 index.yaml 文件,如所讨论的 此处

When using the shortcut syntax db.table[id], id refers to the record ID. db.table[0] doesn't actually refer to an existing record -- it is just used to insert a new record.
Also, on GAE, the record IDs do not start at 1 and get incremented by 1, so your first inserted record will not have ID=1. You can either do:

textobj = db(db.files).select().first()

or

textobj_id = db.files.insert(hash=name, name=name, path=name)
textobj = db.files[textobj_id]

Finally, before deploying to GAE, make sure you have run the app locally using the GAE SDK appserver in order to properly generate the index.yaml file, as discussed here.

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