2014-01-10 51 views
2

我正在運行syncdb來創建一個sqlite數據庫。它一直工作到最近,我沒有看到任何我已經改變的東西,這會導致它失敗。大部分我只是改變了一些字段名稱。OperationalError:在syncdb上沒有這樣的表

我已在在models.py如下:

class GC_User(models.Model): 
     first_name = models.CharField(max_length=50) 
     last_name = models.CharField(max_length=50) 
     email = models.EmailField() 
     wp_userID = models.PositiveSmallIntegerField(unique=True) 

當我刪除舊的數據庫文件運行後執行syncdb,我得到150線追蹤,最後一部分是:

File "C:\Python33\lib\site-packages\django\db\backends\util.py", line 53, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Python33\lib\site-packages\django\db\backends\sqlite3\base.py", line 450, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.OperationalError: no such table: gameconapp_gc_user 

有關可能會導致此問題的任何想法?如果這可能會有幫助,我可以投入更多的追蹤。

謝謝!

更新:多挖後,我的合作伙伴確定問題是應用程序的init.py漸漸調用。由於那裏的例程試圖訪問GC_User表,它沒有這樣的表錯誤。

現在我已經註釋掉了,所以我可以運行syncdb,一旦我們在生產中,我們不會重置數據庫,但它對我來說是違反直覺的,即應用程序在數據庫設置之前被初始化向上。

+0

您可以在'try/except'內初始化您的應用程序,並在數據庫表尚未設置時自動失敗。所以你不需要考慮取消對生產變化的評論 – Thomas

回答

1

由於您在模型中更改了字段名稱,我假設您使用南來處理遷移。如果是這種情況:在運行遷移時,south不會初始化數據庫,直到syncdb之後。當服務器啓動時,Django加載所有__init__models.py文件。這些文件中需要訪問數據庫的任何代碼都需要在try /中進行包裝,除非他們使用南方。

try: 
    #code requiring database access here 
except OperationalError: 
    #close the database connection 
    connection.close() 

這樣,如果由於某種原因需要再次安裝新的數據庫,您不必再擔心它。或者,因爲你的應用程序不是可重用的應用程序,所以下次你必須從頭開始,只需要刪除南遷移(它們只對現有數據庫是必需的)。

class ExpenseIndividualForm(Form): 
    """ 
    Form to get a specific expense (Individual) 
    """ 
    date = forms.DateField(label=u"Date", initial=datetime.date.today()) 
    category = forms.ChoiceField(label=u"Catégorie", choices=get_individual_choices()) 
    employee = forms.ChoiceField(label=u"Utilisateur", choices=get_employee_choices()) 

爲哪些函數get_individual_choicesget_employee_choice查找到數據庫:

+0

我對南方並不熟悉,我一直主要通過大量的試驗和錯誤的文檔來教我自己。這聽起來很有用。 我在init.py中放入的代碼實際上並不需要在每次啓動時運行,所以我將它放在經理或管理員可以明確運行的任務菜單上。 –

+0

@BeverlyBlock已經有一段時間了,沒有看到您的評論。當你想改變模型字段而不必重新設置你的數據庫時,South會發揮作用。它將遷移現有的數據庫以匹配新的字段。它非常易於使用,並將在下一個版本中成爲django的一部分,所以一定要開始使用它。 – arctelix

1

雖然討論的是有點老了,我是因爲我是用了哪些選擇需要一個數據庫連接ChoiceFields,例如有同樣的錯誤。

當我執行manage syncdb時,它會導入類並執行初始化代碼,這會導致一個非常模糊的錯誤。

提議arctelix,保護這些功能的代碼中try... except OperationalError解決問題

2

我有這個問題與當地的SQLite 3數據庫。首先,我刪除了該文件以確保。

爲了解決這個問題,我用syncdb --no-initial-data然後繼續使用migrate每個應用程序提到,被說成不同步:

./manage.py syncdb --no-initial-data 
./manage.py migrate app1 
./manage.py migrate app2 
./manage.py migrate app3 

沒有保證的順序所以這也需要手動完成,只是檢查什麼順序適合你。在我的情況下,simple_email_confirmation應用程序必須先做其他事情。經過幾次嘗試,./manage.py migrate本身應該工作。

相關問題