2016-05-01 5 views
0

私のDjangoプロジェクトにはユーザが直面しているサイトがあり、ユーザのDBテーブルに新しいオブジェクトを挿入することはめったにありません(後で数百、おそらく数千になるでしょう)。定期的にDjango DBをWebで収穫したデータで更新するロングランナー - ?

さらに、1日に数回、私のすべてのオブジェクトに対して外部Webサービスを照会する必要がありますが、ゆっくりと「10秒あたり1回のリクエスト」ルールに違反しないようにしてください。だから、この2番目のタスクは長いランナーです、私はurls.pyの要求を介してルーティングすることはできません。

したがって、(uWSGI)サーバープロセス以外に、私はバックグラウンドで2番目のプロセスを実行します。同じデータベースで作業する必要があります(デフォルトのsqlite3を使用)。

  • 同じDBにアクセスすると同時実行性の問題に遭遇できますか? (どのように)Djangoは私からそれを保護することができますか? (そうでない場合)解決方法?
  • 私のmodels.pyをインポートすることは、私がdjango DBにアクセスするために必要なことですか?
  • 私に役立つヒントはありますか?

ありがとうございます!
Stackoverflow rocks!

だけでなく、コマンドラインアプリケーションを書くための:-)

+1

あなたが本当におもちゃのサイト以外でのsqliteを使用するべきではありません。 –

+0

私は知っています。そして私はそれをpostgresqlと置き換える方法を知っています - すでに別のプロジェクトのためにそれを行っています。しかし、私は最後にsqlite3に戻りました。なぜなら、postgresqlよりはるかに高速であることが分かったからです。そのプロジェクトではタイミングが最も重要な側面でした。とにかく、そのリマインダーのおかげで! – AltSheets

答えて

3

ジャンゴprovides facilities。このようにして、モデルを含むウェブプロセスから得られるすべてのものにアクセスすることができます。

同時性はdjangoではなくデータベースによって処理されるため、そのことを心配する必要はありません。同時に複数のデータを書き込む必要があり、同期が取れない場合は、使用する可能性があるのはtransactionsです。

manage.pyを使用して、それを実行し、上記のクラスは、アプリの一つに management/commands/mycommand.pyフォルダ内にあると仮定すると、
class Command(BaseCommand): 
    def handle(self, *args, **kwargs): 
     try: 
      while True: 
       self._fetch_data() 
       time.sleep(10) 
     except KeyboardInterrupt: 
      pass 

    def _fetch_data(self): 
     data = ... # fetch data here 
     MyModel.objects.create(foo=data.foo, bar=data.bar) # insert into db 

python manage.py mycommand 
+0

sqlite3では、並行コマンドを実行するときにdjangoに不満があります。ダニエルローズマンはあなたの質問に彼のコメントで指摘するように、あなたは本当にsqliteのMySQL/Postgresql /などの交換を見てください。具体的には、例外を投げてデータの破損がないようにしましたが、それでも検出/再試行が必要です。 – Foon

+0

うわー、これは私が必要とするものです。 "カスタムdjango-adminコマンド" ==完璧です。それをします。 – AltSheets

+0

非常に感謝しています! @Anonymous - 自分の "Djangoのヒーロー"と呼ぶことができます。 :-) Grrrrreat! – AltSheets

関連する問題