1

我正在尝试在 web2py 的数据库中创建一个表。我对此很陌生,并试图掌握 MVC 结构以及如何在两者之间调用。我所做的是在 /models/db.py 我创建了一个数据库:

TestDB = DAL("sqlite://storage.sqlite")

然后在我的 /controllers/default.py 我有:

def index():
    form = FORM(INPUT(_name='name', requires=IS_NOT_EMPTY()),
              INPUT(_type='submit'))

    if form.process().accepted:
        TestDB().define_table(form.vars.name, Field('testField', unique=True))
        return dict(form=form)

    return dict(form=form)

但这行不通。有人可以帮助我了解如何实现这一目标吗?

谢谢你。

4

1 回答 1

2

首先,要定义表,它将是TestDB.define_table(...),而不是TestDB().define_table(...)

其次,表定义不会跨请求持久化(当然,数据库表本身会持久化,但 DAL 表定义不会)。因此,如果您在index()函数内部定义了一个表,那么它是唯一存在且可在您的应用程序中访问的位置。如果您想在应用程序的其他地方访问该表,您需要将有关表定义的元数据(在本例中,只是表名)存储在某处,可能在数据库或文件中。然后,您将在每个请求上检索该信息(并可能将其缓存以加快处理速度)并使用它来创建表定义。

另一种选择是生成表定义代码并将其附加到模型文件中,以便在每个请求上自动运行。这大致是“admin”应用程序中的新应用程序向导在生成新应用程序时的工作方式。

最后,您可以将表定义保留在index()函数中,然后在每个请求上创建数据库连接时,您可以使用auto_import

TestDB = DAL("sqlite://storage.sqlite", auto_import=True)

这将根据存储在应用程序的 /databases/*.table 文件中的元数据自动为 TestDB 中的所有表创建表定义。请注意,元数据仅包括特定于数据库的元数据,例如表和字段名称以及字段类型——它不包括特定于 web2py 的属性,例如验证器、默认值、计算函数等。因此,此选项是有限的用处。

当然,所有这些都具有安全隐患。如果您让用户定义表和字段,则特定提交可能会错误地或恶意地更改现有的数据库表。因此,在处理用户提交之前,您必须进行一些仔细检查。

于 2012-04-25T14:55:32.320 回答