Django1.7導入 データベース移行 .
Django 1.7でユニットテストを実行すると、migrateが強制されます。これには長い時間がかかります。そこで、Djangoの移行をスキップし、最終状態でデータベースを作成したいと思います。
コードのその部分はテストされないため、移行を無視することは悪い習慣になる可能性があることを知っています。しかし、そうではありません。CIテストサーバー(ジェンキンス)で完全な移行を実行しています。速度が重要なローカルテストでの移行のみをスキップします。
コンテキスト:
Django1.6までは、Southを使用するときに SOUTH_TESTS_MIGRATE 設定:
デフォルトでは、Southのsyncdbコマンドは、テストを実行しているときなど、非インタラクティブモードで実行されている場合も移行を適用します。テストを実行するたびにすべての移行が実行されます。
テストランナーで、移行の代わりにsyncdbを使用する場合-たとえば、移行の適用に時間がかかりすぎる場合-settings.pyでSOUTH_TESTS_MIGRATE = Falseを設定します。
ただし、syncdbはもう存在せず、現在はmigrateです。
Django1.8から-keepdb を使用しますパラメーター:
--keepdbオプションを使用すると、テスト実行間でテストデータベースを保持できます。これには、作成アクションと破棄アクションの両方をスキップするという利点があり、特に大規模なテストスイートでテストを実行する時間が大幅に短縮されます。テストデータベースが存在しない場合は、最初の実行時に作成され、その後の実行ごとに保存されます。テストスイートを実行する前に、未適用の移行もテストデータベースに適用されます。
したがって、この質問はDjango 1.7に限定されます。
この回避策 をご覧ください。BernieSumptionがDjango開発者のメーリングリストに投稿しています。
Makemigrationsがまだ実行されていない場合、「migrate」コマンドはアプリを移行されていないものとして扱い、1.6でsyncdbが行ったようにモデルから直接テーブルを作成します。 「settings_test.py」というユニットテスト専用の新しい設定モジュールを定義しました。これは、メイン設定モジュールから*をインポートし、次の行を追加します。
MIGRATION_MODULES = {"myapp": "myapp.migrations_not_used_in_tests"}
次に、次のようなテストを実行します。
Django_SETTINGS_MODULE = "myapp.settings_test" python manage.py test
この愚か者は、アプリが移行されていないと考えるように移行するため、テストデータベースが作成されるたびに、models.pyの現在の構造が反映されます。
Django= 1.9、この状況 多少改善されています で、値をNone
に設定できます:
MIGRATION_MODULES = {"myapp":なし}
これが私の設定ファイルの終わりです:
class DisableMigrations(object):
def __contains__(self, item):
return True
def __getitem__(self, item):
return None
TESTS_IN_PROGRESS = False
if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
logging.disable(logging.CRITICAL)
PASSWORD_HASHERS = (
'Django.contrib.auth.hashers.MD5PasswordHasher',
)
DEBUG = False
TEMPLATE_DEBUG = False
TESTS_IN_PROGRESS = True
MIGRATION_MODULES = DisableMigrations()
これに基づいて スニペット
テストの実行中にのみ移行を無効にしました
Django-test-without-migrations は、--nomigrations
フラグをmanage.py test
に追加します。魅力のように機能します。
Update:気にせず、この変更は reverted 1.10 finalがリリースされる前でした。うまくいけば、将来のバージョンで返ってくるでしょう。
Django 1.10以降、これはテストデータベースの設定によって制御できることに注意してください。
移行
デフォルト:
True
False
に設定すると、Djangoはテストデータベースの作成に移行を使用しません。
https://Gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
MIGRATION_MODULES = {
app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
for app in INSTALLED_APPS
}
Django 1.9以上の場合、Guillaume Vincentの回答は機能しません。そこで、新しいソリューションを示します。
INSTALLED_APPS
の定義の後、設定ファイルでこのスニペットを使用しています
if os.environ.get('TESTS_WITHOUT_MIGRATIONS', False):
MIGRATION_MODULES = {
app.split('.')[-1]: None for app in INSTALLED_APPS
}
インストールされているすべてのアプリを反復処理し、それぞれに移行モジュールがないとマークします。 詳細についてはDjangoのドキュメント を参照してください。
このスニペットを使用すると、環境変数TESTS_WITHOUT_MIGRATIONS
を設定してテストを実行できます。例:
TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test
Django 1.10の後に移行を無効にする方法を見つけました。誰かに役立つかもしれません。ここに link at git
_class DisableMigrations(dict):
def __contains__(self, item):
return True
def __getitem__(self, item):
return None
DATABASES = DisableMigrations()
MIGRATION_MODULES = DisableMigrations()
_
Django 1.10の移行には2つの部分があります。 load_disk および recorder をご覧ください。
_load_disk
_で追加されるアプリの移行モデルの_INSTALL_APP
_の部分とデータベース接続のrecorder
の部分1.9より前のバージョンでは、_MIGRATION_MODULES={'do.not.migrate':'notmigrations'}
_を設定する必要がありますテストの実行ここで、_MIGRATION_MODULES={'do.not.migrate':None}
_のようにNoneに設定する必要があります。したがって、アプリケーションの移行を行わない場合は、dictを拡張し、None
for getitem
functionを返し、 DATABASES
、それはあなたがする必要がある正しいことです
PS:コマンドの場合、test
の後に_--setting=module.path.settings_test_snippet
_を指定する必要があります[〜# 〜] pps [〜#〜]pycharm
を使用している場合、do notset _--settings
_オプションは_Run/Debug configurations
_で、カスタム設定で_settings_test_snippet.py
_のパスを追加するだけです。それは大丈夫です!!
楽しい