2014-12-03 75 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