So-net無料ブログ作成
  • ブログをはじめる
  • ログイン

Django のデーターベースルーター [Python]

複数のデーターベースの接続先を設定して、

Article.objects.using('smapdb').filter(条件...)

というように、 using() をつけると指定のデーターベースへの QuerySet が取得できる。

モデル毎にアクセスするデータベースを切り替えたいというときには、データーベースルーターというのを使えいいらしいというのは聞いていたが、必要になって調べてみると、(また)tokibito さんが以前書いていた。ありがたやありがたや。

https://tokibito.hatenablog.com/entry/20160202/1454344534

ただ、試してみるとコードがちょっとおかしい。
allow_relation() と allow_migrate() で、myapp でないときの処理が足りないようだ。
また、 db_for_read() と db_for_write() は間違ってはいないけど、 if 文の条件に合わない場合に None をかえしているのがわかりにくい

MyAppRouter を以下のようにしたら、意図した結果になった。

class MyAppRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'myapp':
            return 'smapdb'
        return None
    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'myapp':
            return 'spamdb'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if (obj1._meta.app_label == 'myapp' and
           obj2._meta.app_label == 'myapp'):
           return True
        elif (obj1._meta.app_label != 'myapp' or
           obj2._meta.app_label != 'myapp'):
           return True
        return False

    def allow_migrate(self, db, app_label, model=None, **hints):
        if app_label == 'myapp':
            return db == 'smapdb'
        else:
            return db != 'smapdb'

コメント(0) 
共通テーマ:日記・雑感

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

Facebook コメント