私の質問に対するコメントのおかげで、私はいくつかの調査を行い、以下の発見を思いつきました。
複数のデータベースを使用するとdjango_migrations
、移行の使用時にテーブルが作成されます。Kamil Niskiのdjango_migrations
コメントで説明されているように、移行を1つのテーブルのみに記録するオプションはありません。これはファイルを読んだ後は明らかですdjango/db/migrations/recorder.py
。
プロジェクトfoo
とbar
プロジェクト内のアプリの例を示します。アプリのbar
モデルは1つだけですBaz
。
プロジェクトを作成します。
django-admin startproject foo
これで、これらのコンテンツがメインプロジェクトディレクトリ内にあります。
- foo
- manage.py
プロジェクトディレクトリ内のすべてのアプリをグループ化する習慣があります。
mkdir foo/bar
python manage.py bar foo/bar
このファイルでfoo/settings.py
は、この例の目的のために、2つの異なるデータベースを使用するように設定を調整しますsqlite3
。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db1.sqlite3'),
},
'remote': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
}
}
次に、マイグレーションを実行します。
python manage.py migrate --database=default
これはすべての移行を実行します --database=default
ます。指定しない場合、Djangoはデフォルトのデータベースを使用するためはオプションです。
実行する操作:
すべての移行の適用: admin、auth、contenttypes、session
実行中の移行:
contenttypes.0001_initialを適用しています... OK
auth.0001_initialを適用しています... OK
admin.0001_initialを適用しています... OK
admin.0002_logentry_remove_auto_addを適用しています... OK
admin.0003_logentry_add_action_flag_choicesを適用しています... OK
contenttypes.0002_remove_content_type_nameを適用しています... OK
auth.0002_alter_permission_name_max_lengthを適用しています... OK
auth.0003_alter_user_email_max_lengthを適用しています... OK
auth.0004_alter_user_username_optsを適用しています... OK
auth.0005_alter_user_last_login_nullを適用しています... OK
auth.0006_require_contenttypes_0002を適用しています... OK
auth.0007_alter_validators_add_error_messagesを適用しています... OK
auth.0008_alter_user_username_max_lengthを適用しています... OK
auth.0009_alter_user_last_name_max_lengthを適用しています... OK
auth.0010_alter_group_name_max_lengthを適用しています... OK
auth.0011_update_proxy_permissionsを適用しています... OK
セッションを適用しています。0001_initial... OK
Djangoはすべての移行をデフォルトのデータベースに適用しました:
1 contenttypes 0001_initial 2019-11-13 16:51:04.767382
2 auth 0001_initial 2019-11-13 16:51:04.792245
3管理者0001_initial 2019-11-13 16:51:04.827454
4管理者0002_logentr 2019-11-13 16:51:04.846627
5管理者0003_logentr 2019-11-13 16:51:04.864458
6 contenttypes 0002_remove_ 2019-11-13 16:51:04.892220
7 auth 0002_alter_p 2019-11-13 16:51:04.906449
8 auth 0003_alter_u 2019-11-13 16:51:04.923902
9 auth 0004_alter_u 2019-11-13 16:51:04.941707
10 auth 0005_alter_u 2019-11-13 16:51:04.958371
11 auth 0006_require 2019-11-13 16:51:04.965527
12 auth 0007_alter_v 2019-11-13 16:51:04.981532
13 auth 0008_alter_u 2019-11-13 16:51:05.004149
14 auth 0009_alter_u 2019-11-13 16:51:05.019705
15 auth 0010_alter_g 2019-11-13 16:51:05.037023
16 auth 0011_update_ 2019-11-13 16:51:05.054449
17セッション0001_initial 2019-11-13 16:51:05.063868
次に、モデルを作成しますBaz
。
models.py
:
from django.db import models
class Baz(models.Model):
name = models.CharField(max_length=255, unique=True)
アプリbar
をINSTALLED_APPS
(foo/settings.py
)に登録し、移行を作成します。
python manage.py makemigrations bar
移行を実行する前に、routers.py
内部で作成しますbar
アプリ。
クラスBarRouter(オブジェクト):
def db_for_read(self、model、** hints):
if model._meta.app_label == 'bar':
「リモート」を返す
戻り値なし
def db_for_write(self、model、** hints):
if model._meta.app_label == 'bar':
「リモート」を返す
戻り値なし
def allow_relation(self、obj1、obj2、** hints):
戻り値なし
def allow_migrate(self、db、app_label、model_name = None、** hints):
app_label == 'bar'の場合:
db == 'remote'を返す
db == 'remote'の場合:
Falseを返す
戻り値なし
そしてそれを登録してfoo/settings.py
ください:
DATABASE_ROUTERS = ['foo.bar.routers.BarRouter']
今の素朴なアプローチはbar
、remote
データベースへの移行を実行することです:
python manage.py migrate bar --database=remote
操作は実行する:
すべてのマイグレーションを適用します。バー
の移行の実行します:
bar.0001_initialを適用しています... OK
移行がremote
データベースに適用されました:
1小節0001_initial 2019-11-13 17:32:39.701784
実行すると:
python manage.py runserver
次の警告が発生します。
未適用の移行が1つあります。アプリの移行を適用するまで、プロジェクトが正しく機能しない可能性があります:バー。
それらを適用するには、「python manage.py migrate」を実行します。
すべてがうまくいくようですが。ただし、この警告が表示されるだけでは不十分です。
この回答で提案されているように、適切な方法は、各データベースのすべての移行を実行することです。
次のようになります。
python manage.py migrate --database=default
python manage.py migrate --database=remote
の移行を作成した後bar
:
python manage.py migrate bar --database=default
python manage.py migrate bar --database=remote
ルーターはテーブルbar_baz
がremote
データベースにのみ作成されるように注意しますが、Djangoは移行を両方のデータベースに適用されるものとしてマークします。また、、、などのテーブルはauth
、admin
で指定されているようsessions
に、default
データベースにのみ作成されrouters.py
ます。データベースのテーブルにdjango_migrations
は、remote
これらの移行のレコードも含まれます。
それは長い読み物ですが、私の意見では、公式ドキュメントで問題を完全に説明していないので、これについていくつかの光が当てられることを願っています。