我正在尝试在web2py中的数据库中创建一个表。我是新手,试图掌握MVC结构以及如何调用它们。 我所做的是在/modles/db.py我创建了一个DB:
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)
但这不起作用。有人可以帮我理解如何实现这个目标吗?
谢谢。
答案 0 :(得分: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的属性,例如验证器,默认值,计算功能等。因此,此选项有限效用
当然,所有这些都具有安全隐患。如果您允许用户定义表和字段,则特定提交可能会错误地或恶意地更改现有数据库表。因此,在处理用户提交之前,您必须仔细检查。