2014-12-03 77 views
0

我想在需要时创建某些预定义的表 - 让我们说当用户想要将某个功能添加到应用程序时。如何在运行时创建DB-Tables

据我所知,模型“描述数据表示” - 所以我想我的预定义表必须去这里。我在db.py试过这样:

def create_my_table(): 
    db.define_table('mytesttable', 
     Field('mytest', 'text') 
      ) 

我不明白的是,如何调用此方法。这是行不通的:

{{ =A('Create Table', _href = URL('create_my_table')) }} 

回答

1

默认情况下,该URL识别控制器内的控制器和功能,而框架中运行该功能(执行模型文件后)。您无法在模型文件中定义函数,然后通过将其名称包含在URL中来调用该函数。相反,您应该将该功能放在控制器中,或者从控制器调用您的功能。另外,请注意,虽然在模型文件中定义数据库模型很常见(通常是因为多个控制器中经常需要给定模型),但您可以在任何位置定义模型,包括在控制器中。

另一种选择是使用条件模型功能。例如,您可以在default.py控制器中创建名为create_my_table的控制器操作。然后可以创建/models/default/create_my_table.py模型文件,并且只有在调用/ default/create_my_table操作时才会执行该模型文件(在这种情况下,没有理由将模型定义放入函数中 - 把它放在模型文件的顶层)。您还可以使用response.models_to_run定义更复杂的条件模型执行。有关更多详细信息,请参阅相关的documentation

后一个选项可能会更好,因为当使用appadmin时,所有条件模型都会自动运行,因此您将有权访问条件定义的模型(appadmin将无法访问仅在特定控制器中定义的表)。

+0

再次感谢这个详细的答案 - 我只需要尝试什么是最好的。但是有一个小问题:我尝试了条件模型方法(对应于控制器/操作),但即使在调用标准的'index()'操作时也会遇到错误“表XYZ已存在”。怎么会? – Rockbot 2014-12-03 15:12:37

+0

很难说没有看到你的代码和完整的追溯。 – Anthony 2014-12-03 19:50:36