5

複数のデータベース バックエンドを使用する Django アプリケーションを開発しています。django アプリケーションを実行しているマシンに sqlite データベースを配置し、リモートの mysql データベースと同期したいと考えています。注意が必要なのは、アプリケーションを実行しているこのマシンが常にインターネットに接続されているとは限らないため、mysql データベースが常に利用できるとは限らないことです。アプリケーションを実行する複数のマシンがあり、それぞれが独自のローカル sqlite DB を持ちますが、すべて同じリモート mysql DB を使用します。

私はまだコードを書いていませんが、ここに私が考えているものがあります。挿入または更新を実行するたびに、リモート DB が利用できない場合を除き、両方のデータベースに書き込みたいと思います。その場合、ローカル データベースのテーブルに sql ステートメントを保存して、リモート DB が利用可能なときに実行します。

これはデータベース ルーターで実行できますか、それとも db ステートメントごとに手動で実装する必要がありますか?

PK に関する注意: 直接関係はありませんが、必ず聞かれます。主キーは、各マシンでローカルに生成されます。mysql DB には、このキーのフィールドと、アプリケーションの各インスタンスの一意の識別子を持つフィールドがあり、これらが一緒になって一意のキーを提供します。

4

2 に答える 2

3

DrDee のコードを取得し、post_save シグナルに添付しました (+1 でヘルプが表示されます)。

@receiver(models.signals.post_save) #new signal decorator in Django 1.3
def save_to_remote(sender,instance,using,**kwargs):
    if using == 'default' and instance.__module__ == 'mymodel.myapp.models':
        try:
            instance.save(using='remote')
        except:
            pending_instance=Pending_Remote(
                                            pk_default=instance.pk,
                                            model_default=instance.__class__.__name__
                                            )
            pending_instance.save()

これにより、リモート データベースに保存されなかったものの記録も保存されます。モデル Pending_Remote を「myapp」に含めてはならないことに注意してください。

于 2011-03-19T12:03:12.750 に答える
3

Blog というモデルがあるとします。次に、ローカルおよびリモートに保存するために以下を使用できます (リモート データベースへのアクセスを構成していると仮定します)。

blog = Blog('test') 
blog.save() #Assuming that sqlite is the default db
try:
    blog.save(using='mysql')
except NoInternetConnection:
    pass

settings.py で 'mysql' を定義および構成したこと、およびインターネット接続がない場合に対応していることを確認してください。

サイドノート:なぜあなたが実際にこれをやりたいのかよくわかりません。これがバックアップ目的である場合は、標準のバックアップ手順を使用します。複数のデータベースの使用に関する詳細については、http: //docs.djangoproject.com/en/dev/topics/db/multi-db/#using-raw-cursors-with-multiple-databasesを参照してください。

于 2011-02-09T23:05:45.813 に答える