南方移動がうまくいかないのはなぜですか?
質問
まず、データベースを作成します。
create database mydb;
インストールしたAppsにquot;south"を追加します。 そして、このチュートリアルにアクセスします。 http://south.aeracode.org/docs/tutorial/part1.html
チュートリアルによると、こうすればいいみたいです。
$ py manage.py schemamigration wall --initial
>>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall
素晴らしい、今私は移行する。
$ py manage.py migrate wall
しかし、このようなエラーが発生します...
django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")
そこで私はGoogleを使い(これは決してうまくいきません。それゆえ、Stackoverflowに870の質問をしました)、このページを得ました。 http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c
さて、ではその指示に従います。
>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb
しかし syncdb を実行すると、Django はたくさんのテーブルを作成します。たしかに south_migrationhistory テーブルは作成されますが は私のアプリのテーブルも作成します。
Synced:
> django.contrib.admin
> django.contrib.auth
> django.contrib.contenttypes
> django.contrib.sessions
> django.contrib.sites
> django.contrib.messages
> south
> fable.notification
> pagination
> timezones
> fable.wall
> mediasync
> staticfiles
> debug_toolbar
Not synced (use migrations):
-
(use ./manage.py migrate to migrate these)
クール...今度はこれらを移行するように指示されました。 そこで、私はこうします。
$ py manage.py migrate wall
The app 'wall' does not appear to use migrations.
よし、それでいいんだ。初期マイグレーションに壁を追加してみます。
$ py manage.py schemamigration wall --initial
そして、移行します。
$ py manage.py migrate wall
あのね。このBSが出るんです。
_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")
申し訳ありませんが、これは本当に私をイライラさせています。誰か助けてください。
どうすれば South を動作させ、すべてと正しく同期させることができますか?唯一考えられるのは、INSTALLED_APPS から私のアプリを削除し、syncdb を実行し、それを再び追加することです。
それはとても愚かなことです。
どのように解決するのですか?
South では、新しいアプリを初めて起動したときに、テーブルにまだデータベースが追加されていない場合の移行を作成したり、すでにデータベースにテーブルがあるレガシー アプリの移行を作成したりすることができます。重要なのは、いつ何をすべきかを知っておくことです。
最初の間違いは、移行を削除したときです。そうして syncdb を実行するとすぐに、Django はあなたがもうそのアプリを south で管理したいとは知らないので、あなたのためにテーブルを作りました。最初の移行を作成し、migrate を実行したとき、south は django が既に作成したテーブルを作成しようとしたため、このようなエラーになったのです。
この時点で、2つのオプションがあります。
-
データベースから壁アプリ用のテーブルを削除し、次のように実行します。
$ py manage.py migrate wall
これでマイグレーションが実行され、テーブルが作成されます。 -
最初のマイグレーション実行をフェイクアウトする
$ py manage.py migrate wall 0001 --fake
これは、データベース上にすでにテーブルがあることを south に伝えるので、それを偽造して south_migrationhistory テーブルに行を追加し、次回 migrate を実行するときに、最初の migration がすでに実行されたことを知ることができるようにするためです。
全く新しいプロジェクトとデータベースなしのセットアップ
- データベースを作成する
- インストールされたアプリに南を追加する
- syncdb を実行すると、データベースに django と south のテーブルが追加されます。
- アプリを追加します。
-
各アプリの実行
python manage.py schemamigration app_name --initial
これは、アプリのための最初のマイグレーションファイルを作成します。 -
で、south migrate を実行します。
python manage.py migrate app_name
を実行すると、データベースにテーブルが追加されます。
レガシー・プロジェクトとデータベースのセットアップ
- インストールされたアプリに南を追加する
- syncdb を実行すると、south のテーブルがデータベースに追加されます。
-
各アプリに対して
python manage.py schemamigration app_name --initial
これで、最初のマイグレーションが作成されます -
を実行する各アプリに対して
python manage.py migrate app_name 0001 --fake
を実行すると、southがフェイクアウトされます。これらのモデルのデータベースには何もせず、south_migrationhistoryテーブルにレコードを追加するだけなので、次回マイグレーションを作成したいときには、すべて準備されていることになります。
レガシープロジェクトとデータベースなしのセットアップ
- データベースの作成
- インストールされたアプリに南を追加
-
それぞれのアプリに対して
python manage.py schemamigration app_name --initial
これで、最初のマイグレーションが作成されます - syncdb を実行します。これは、データベースにマイグレーションを持たないアプリを追加します。
-
それから south migrate を実行します。
python manage.py migrate
で、アプリのすべてのマイグレーションが実行されます。
southのセットアップが完了したので、southを使ってアプリのモデルチェンジを管理し始めることができます。実行する最も一般的なコマンドは
python manage.py schemamigration app_name migration_name --auto
で、最後に実行したマイグレーションを調べ、変更点を見つけ、マイグレーションファイルを作成します。次に、以下のコマンドを実行するだけです。
python manage.py migrate
を実行するだけで、データベースを変更してくれます。
お役に立てれば幸いです。
関連
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] バブルソートの宿題
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
-
[解決済み] django syncdbと更新されたモデル