2010-04-13 58 views
5

如何使syncdb執行由我定義的SQL查詢(用於創建表),而不是自動生成表。在Django中,如何在運行syncdb時從SQL文件創建表格

我正在尋找這個解決方案,因爲我的應用程序中的某些特定模型代表了舊式數據庫表的SQL-table-views。 因此,我已經在我的django-DB中創建了他們的SQL視圖,如下所示:

CREATE VIEW legacy_series AS SELECT * FROM legacy.series;

我有一個反向工程模型,代表上面的view/legacytable。但是每當我運行syncdb時,我都必須先運行sql腳本來創建所有的視圖,否則syncdb會爲它們創建表(如果沒有找到視圖)。

如何讓syncdb運行上面提到的SQL?

回答

5

還有我知道你的模型適應舊的數據庫表2種可能的方法(不使用的觀點即是):你的項目中運行python manage.py inspectdb

1)。這將爲現有數據庫表生成模型,然後您可以繼續使用這些模型。

2)用一些特定的設置修改你的表格。首先,通過在元選項中設置db_table選項,在模型中定義表名。其次,通過設置db_column選項,爲每個字段定義列名以匹配舊數據庫。請注意,還有其他可能用於匹配舊數據庫的db_選項。

如果您確實希望視圖方法有一個(醜陋的)解決方法,您可以爲每個應用程序模型定義custom sql commands。該文件位於「application」/ sql /「model」.sql中。在創建所有表之後,Django會調用這個sql的。您可以嘗試爲生成的表指定DROP語句,然後在此文件中指定view create語句。請注意,對於具有外鍵的表來說,這將會有點棘手,因爲django保證沒有這些文件的執行順序(所以將所有語句填充到一個.sql中將是我認爲的最簡單的方式,我從未嘗試過)。

4

您可以使用unmanaged models作爲您的反向工程模型,並使用initial SQL scripts創建您的視圖。

編輯

有點詳細的解答。當您使用非託管模式時,syncdb不會爲您創建數據庫表,因此您必須自己處理。重要的一點是表名,以及django如何將Model類映射到表名,我建議您閱讀the doc on that point

基本上,你的Series模型將看起來像:

class Series(models.Model): 
    # model fields... 
    ... 

    class Meta: 
     managed = False 
     db_table = "legacy_series" 

然後,你可以把你的SQL命令,在yourapp/sql/series.sql文件:

### yourapp/sql/series.sql 
CREATE VIEW legacy_series AS SELECT * FROM legacy.series; 

然後,您可以syncdb像往常一樣,和開始使用您的舊型號。

相關問題