2010-08-30 25 views
2

我有一些服務器啓動代碼位於我的某個Django應用程序的「models.py」中。我需要在服務器啓動時運行該代碼。如何*不*在syncdb上運行Django代碼

的問題是,該代碼發出一個SQL查詢,它使我從psycopg2(它打破了交易,並表不創建。)

將代碼在中間件和提高django.core.exceptions.MiddlewareNotUsed是運行syncdb不是最佳的,因爲我想在Django shell中也有效果(並且將初始化代碼放在中間件中聽起來並不正確)。另外,我需要等待第一個請求來執行此操作。我想在服務器啓動時運行代碼,而不是在第一位客戶敲我的網站時運行代碼。

服務器啓動信號仍然沒有在Django中實現,所以這不是一個選項。

因此,我想以某種方式之一:

  • 檢查,如果Django是運行的執行syncdb,所以我不這樣做的查詢,
  • ,或者檢查相應的表是那麼,如果他們不是,那麼,也不要做任何查詢

非上述兩個選項我在任何文件中找到。我怎麼做?還是有更好的(即理智的)做我想做的事情的方式?

回答

1

Django在啓動時也應該加載urls.py;我無法告訴你這是否適合您的代碼,但如果您想要,請嘗試一下!

+0

聽起來更加古怪,但它可能會解決實際問題。 – 2010-08-30 12:16:15

+0

嗯,我也覺得這很奇怪,但使用'urls.py'有時似乎是一個有用的解決方法,類似的問題! – 2010-08-30 13:49:28

+0

好吧,因爲沒有人能夠提出更好的想法,所以我接受您的解決方案作爲解決方法。謝謝您的幫助。 – 2010-10-10 17:49:09

1

您是否考慮連接到post_syncdb信號?也許你可以在接收到這個信號時運行自定義SQL。這可能會解決您的部分問題;你仍然需要弄清楚如何在服務器啓動時運行SQL。

+0

事情是,我不需要對post_syncdb做任何事情,因爲我只做只讀查詢(即'SELECT')。也就是說,我將一些來自數據庫的信息緩存到內存中。也許一個懶惰的對象可以完成這項工作; – 2010-08-30 12:10:42

1

您可以將檢查在settings.py:

import sys 
... 
IN_SYNCDB = ('syncdb' in sys.argv) 

然後

if not settings.IN_SYNCDB: 
    # run SQL code 
+1

from django.core import management;管理。run_command( '執行syncdb');這是行不通的。 – 2010-08-31 01:01:39

0

如何一點點的異常處理?在執行查詢但數據庫表不存在時,將引發Django.db.utils.DatabaseError。嘗試..除了查詢代碼是滿足你的第二個標準的方式,我認爲。

問題: models.py

class Foo(Model): 
    #model definition here 

def fun(): 
    obj=Foo.objects.get(pk=1) 
    #other logics here... 

fun() #This causes a DatabaseError 

解決方案: models.py

class Foo(Model): 
    #model definition here 

def fun(): 
    obj=Foo.objects.get(pk=1) 
    #other logics here... 

try: 
    fun() 
except DatabaseError: 
    pass 
相關問題