[解決済み] Django migrate の --fake と --fake-initial について説明します。
質問
私は2年ほど前から Django を使っていますが、いつも使うのをためらっていた機能があります。 マイグレーションの偽造 .
かなりあちこち探しましたが、最も多くの情報を得ることができるのは ドキュメント に書かれていることです。
-フェイク
Django に migrations を適用済みか未適用かをマークするように指示します。 しかし、実際に SQL を実行してデータベースのスキーマを変更することはありません。 データベーススキーマを変更する SQL を実際に実行することなく。
これは、上級ユーザが手動で変更を適用する場合に、現在の移行状態を直接操作するためのものです。 手動で変更を適用している場合、現在の移行状態を直接操作するためのものです。 fake を使用すると、移行状態のテーブルを手動で回復する必要がある状態にする危険性があることに注意してください。 テーブルを、移行を正しく実行するために手動で回復する必要がある状態にする危険があることに注意してください。 を使うと、移行を正しく実行するために手動で回復する必要がある状態に移行状態テーブルを置くリスクがあることに注意してください。
-fake-initial
Django がアプリの初期マイグレーションをスキップできるようにします。 テーブルが既に存在している場合、アプリの最初の移行をスキップすることができます。 操作で作成された全てのモデルの名前を持つデータベーステーブルが既に存在する場合、アプリの初期マイグレーションをスキップできるようにします。このオプションは を使う前のデータベースに対して初めて migrations を実行するときに使います。 に対して初めてマイグレーションを実行するときに使用するためのオプションです。しかし、このオプションは データベーススキーマが一致するかどうか、テーブル名が一致するかどうかまではチェックしません。 既存のスキーマが最初の移行で記録されたものと一致すると確信がある場合にのみ使用するのが安全です。 が最初の移行で記録されたものと一致すると確信がある場合にのみ使用してください。
一般的なアイデアと、この機能を使用したい理由は理解できます。しかし、以下の部分が理解できません。 上級ユーザーのみを対象としています。
どなたか、舞台裏で何が起こっているのか、なぜ手動での復旧が必要なのかを説明していただけませんか。
注意
私は、移行を偽造するときに実行される正確な生の SQL クエリを探しているわけではありません。私は、シーンの背後で起こっていることの一般的なアイデアと、なぜマイグレーションを偽装するのかの例を探しているだけです。
を実行した結果
makemigrations
が正しく動作しない状態になる理由の例を探しています。
どのように解決するのですか?
ソースコード(git)において、似たようなモデルを持つ2つのブランチを結合したり、ブランチ間を切り替えたりする必要がある場合、マージの競合に似たデータベースの問題に関連します。誰も意図的にそれを好きではありません。
先週、バグを見つけたり、フィールドやテーブルによってアプリケーションを拡張したりするために、アプリケーションを修正し始めたと想像してください。なぜなら、まだデータベースにあるフィールドを追加する移行があり、その移行の他の部分のみを適用することができるからです。を実行して、移行の SQL コンテンツを見ます。
./manage sqlmigrate some_app 0007_new_migration >customized-some_app-0007_new_migration.sql
は先週変更した内容と比較し、まだ適用されていて繰り返せないコマンドは削除するかコメントアウトしてください。残りのSQLをすべて手動で実行します。その移行を自動的に適用されるようにマークします。
./manage migrate --fake some_app 0007_new_migration
もし何かを壊してしまったら、おそらく誰も助けてはくれません。なぜなら、移行システムはデータベースの現在の状態をより多く知ることができないからです。したがって、バックアップを取り、メモを書き、サンドボックスを使用し、正確に作業してください。
EDITです。
移行テーブル
django_migrations
はすべてのアプリで適用されたマイグレーションのシンプルなリストです。このテーブルの行は常にデータベース構造と同期した状態であるべきです。マイグレーションは通常の
migrate
. (または古い状態への逆移行によって適用されなくなります。もちろん、通常は何らかのデータ損失があります) 偽の移行は django_migrations テーブルにのみ変更を適用します。
me => select * from django_migrations;
id | app | name | applied
----+----------+-------------------------+-------------------------------
1 | some_app | 0001_initial | 2017-10-16 06:11:07.31249+02
2 | some_app | 0002_auto_20171016_1905 | 2017-10-17 02:05:48.979295+02
マイグレーション(ファイル)とは、インクリメンタルな変化を記述したものであり、かつ
models.py
を実行するときに比較される、最後のマイグレーションからの差分を評価するための情報です。
makemigrations
. これは、いくつかのテーブルが最初は非管理型で、後に管理型になる可能性がある場合にも十分である。(したがって、非管理テーブルも記録されます)。
EDITです。
例:どのように
sqlmigrate
と
--fake
を使用することができます。
マイグレーションで壊れたデータベースを修正する
(削除されたテーブルを再作成する)ために使用されます。
EDITです。
例 もし、あるアプリケーションのテーブルを削除し、再度
migrate
(警告と以下の私のコメントをご覧ください)、おそらく、最初のマイグレーションを含むそのアプリケーションのすべてのマイグレーションを最初にリセットしたいと思うでしょう、擬似マイグレーション名 "
ゼロ
とします。
./manage migrate --fake some_app zero
.
関連
-
[解決済み】Djangoのクエリセットフィルタリングでnot equalを行うにはどうすればよいですか?
-
[解決済み] django の OneToOneField と ForeignKey の違いは何ですか?
-
[解決済み] Django で完全な/絶対的な URL (ドメイン付き) を取得するにはどうすればよいですか?
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み] Django South - テーブルはすでに存在する
-
[解決済み] Django の filter と get は単一オブジェクトの場合?
-
[解決済み] モデルとリレーションシップフィールドの名前を変更するためのDjangoマイグレーション戦略
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] Django 1.7でユニットテストを実行する際にmigrationsを無効にする
-
[解決済み] Django 1.7とデータマイグレーションで初期データを読み込む
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Djangoは、フォームを送信するときに403エラーに遭遇しました。CSRF 検証に失敗しました。
-
[解決済み] Django のクエリで OR フィルタを行うにはどうすればよいですか?
-
[解決済み] Django REST Framework: ModelSerializerに追加フィールドを追加する
-
[解決済み] Django は静的ファイルの URL をビューで取得します。
-
[解決済み] 学習に適したオープンソースのdjangoプロジェクト【非公開
-
[解決済み] Django モデルで外部キーフィールドをオプションにすることはできますか?
-
[解決済み] Djangoで異なる設定でUnitテストを行うには?
-
[解決済み] Django 1.9 の apps.py の目的は何ですか?
-
[解決済み] list_display - メソッド用のブール型アイコンです。
-
[解決済み] Django の日付テンプレートのデフォルトフォーマットを変更するには?