2012-04-25 63 views
1

我试图在web2py的数据库中创建表。我对此并不熟悉,并试图获得MVC结构以及如何调用它们。 我所做的是在/modles/db.py我创建了一个DB:我/controllers/default.pyWeb2Py - 从用户输入创建表

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

然后,我有:

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) 

但是,这是行不通的。有人能帮助我理解如何实现这一目标吗?

谢谢。

回答

2

首先,定义表格,它将是TestDB.define_table(...),而不是TestDB().define_table(...)。其次,表定义不会在请求间持续存在(当然,数据库表本身保持不变,但DAL表定义不会)。因此,如果您在index()函数中定义了一个表格,那么这是它存在并且可以在您的应用程序中访问的唯一位置。如果您想要访问应用程序中的其他位置的表,则需要在某处(可能位于数据库或文件中)存储有关表定义的元数据(本例中只是表名)。然后,您可以在每个请求中检索该信息(并可能缓存该信息以加快速度)并使用它来创建表定义。

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

最后,你可以离开表定义在index()功能你拥有了它,然后当你创建的每个请求的数据库连接,你可以使用auto_import

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

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

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

+0

非常感谢安东尼。所以这就是为什么我没有看到Appadmin中的数据库。但是,如果我想让用户创建表格,您认为这样做的正确方式是什么? – madu 2012-04-26 13:21:39

+0

上面有三个建议 - 你有尝试过吗? – Anthony 2012-04-27 06:11:27