Django Celery で使用する別のデータベースを設定することは可能ですか?
複数のデータベースを構成するプロジェクトがあり、Django Celery でデフォルトのデータベースを使用したくありません。
djangoセロリの管理ページを引き続き使用して、この別のデータベースに保存されている結果を読み取ることができればいいと思います:)
Django Celery で使用する別のデータベースを設定することは可能ですか?
複数のデータベースを構成するプロジェクトがあり、Django Celery でデフォルトのデータベースを使用したくありません。
djangoセロリの管理ページを引き続き使用して、この別のデータベースに保存されている結果を読み取ることができればいいと思います:)
はい、できます。
1つ目:2つのデータベースを設定し、セロリタスク用に2つ目のデータベースを明示的に指定できます(例obj.save(using='second')
)
またはsettings.py
、セロリに使用される秒を作成します。
./manage.py celeryd --settings_second
Django データベース ルーターを使用して、django-celery モデル用に別のデータベースをセットアップできるはずです。
https://docs.djangoproject.com/en/1.4/topics/db/multi-db/#automatic-database-routing
これは特に django-celery でテストしていませんが、何らかの理由で機能しない場合は、django-celery (または Django 自体) のバグであり、修正する必要があります。
ルーターは次のようになります。
class CeleryRouter(object):
"Route Celery models to separate DB."
APPS = (
'django', # Models from kombu.transport.django, if you're using Django as a message transport.
'djcelery',
)
DB_ALIAS = 'celery'
def db_for_read(self, model, **hints):
if model._meta.app_label in self.APPS:
return self.DB_ALIAS
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in self.APPS:
return self.DB_ALIAS
return None
def allow_relation(self, obj1, obj2, **hints):
if (obj1._meta.app_label in self.APPS and
obj2._meta.app_label in self.APPS):
return True
return None
def allow_syncdb(self, db, model):
if db == self.DB_ALIAS:
# Only put models from APPS into Celery table (and south for
# migrations).
return model._meta.app_label in self.APPS + ('south',)
elif model._meta.app_label in self.APPS:
# Don't put Celery models anywhere else.
return False
return None
次に、これを設定に追加します。
DATABASE_ROUTERS = ['path.to.CeleryRouter']