2

Django アプリの 1 つの「models.py」にあるサーバー起動コードがいくつかあります。サーバーの起動時にそのコードを実行する必要があります。

問題は、コードが SQL クエリを発行し、実行できないことですsyncdb(psycopg2トランザクションが中断され、テーブルが作成されません)。

コードをミドルウェアに入れて上げるのdjango.core.exceptions.MiddlewareNotUsedは最適ではありません.Djangoシェルでも効果が欲しいからです(また、初期化コードをミドルウェアに入れるのは正しく聞こえません.)それをする最初の要求。最初の顧客が私の Web サイトを訪れたときではなく、サーバーの起動時にコードを実行したいと考えています。

サーバーの起動シグナルは Django ではまだ実装されていないため、これはオプションではありません。

したがって、私は何とかしたいと思います:

  • Django が syncdb を実行しているかどうかを確認するため、クエリは実行しません。
  • または、代わりに、対応するテーブルがあることを確認し、そうでない場合も、クエリを実行しないでください

上記の 2 つのオプションのいずれも、どのドキュメントにも見つかりませんでした。それ、どうやったら出来るの?または、私がやりたいことを行うためのより良い(つまり、正気の)方法はありますか?

4

4 に答える 4

1

あなたはsettings.pyにチェックを入れることができます:

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

それで

if not settings.IN_SYNCDB:
    # run SQL code
于 2010-08-30T14:01:08.277 に答える
1

post_syncdb信号への接続を検討しましたか?おそらく、このシグナルの受信時にカスタム SQL を実行できます。これにより、問題の一部が解決する場合があります。サーバーの起動時に SQL を実行する方法を理解する必要があります。

于 2010-08-30T11:52:14.550 に答える
1

Django もurls.py起動時にロードする必要があります。それがあなたのコードに適した場所かどうかはわかりませんが、必要に応じて試してみてください!

于 2010-08-30T11:43:33.430 に答える
0

ちょっとした例外処理はどうですか?クエリを実行してもデータベース テーブルが存在しない場合、aDjango.db.utils.DatabaseErrorが発生します。私が思うように、クエリコードが2番目の基準を満たす方法であることを除いて。

問題: 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
于 2012-04-22T21:10:17.483 に答える