1. ホーム
  2. python

南方移動がうまくいかないのはなぜですか?

2023-08-25 21:53:52

質問

まず、データベースを作成します。

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つのオプションがあります。

  1. データベースから壁アプリ用のテーブルを削除し、次のように実行します。 $ py manage.py migrate wall これでマイグレーションが実行され、テーブルが作成されます。

  2. 最初のマイグレーション実行をフェイクアウトする $ py manage.py migrate wall 0001 --fake これは、データベース上にすでにテーブルがあることを south に伝えるので、それを偽造して south_migrationhistory テーブルに行を追加し、次回 migrate を実行するときに、最初の migration がすでに実行されたことを知ることができるようにするためです。

全く新しいプロジェクトとデータベースなしのセットアップ

  1. データベースを作成する
  2. インストールされたアプリに南を追加する
  3. syncdb を実行すると、データベースに django と south のテーブルが追加されます。
  4. アプリを追加します。
  5. 各アプリの実行 python manage.py schemamigration app_name --initial これは、アプリのための最初のマイグレーションファイルを作成します。
  6. で、south migrate を実行します。 python manage.py migrate app_name を実行すると、データベースにテーブルが追加されます。

レガシー・プロジェクトとデータベースのセットアップ

  1. インストールされたアプリに南を追加する
  2. syncdb を実行すると、south のテーブルがデータベースに追加されます。
  3. 各アプリに対して python manage.py schemamigration app_name --initial これで、最初のマイグレーションが作成されます
  4. を実行する各アプリに対して python manage.py migrate app_name 0001 --fake を実行すると、southがフェイクアウトされます。これらのモデルのデータベースには何もせず、south_migrationhistoryテーブルにレコードを追加するだけなので、次回マイグレーションを作成したいときには、すべて準備されていることになります。

レガシープロジェクトとデータベースなしのセットアップ

  1. データベースの作成
  2. インストールされたアプリに南を追加
  3. それぞれのアプリに対して python manage.py schemamigration app_name --initial これで、最初のマイグレーションが作成されます
  4. syncdb を実行します。これは、データベースにマイグレーションを持たないアプリを追加します。
  5. それから south migrate を実行します。 python manage.py migrate で、アプリのすべてのマイグレーションが実行されます。

southのセットアップが完了したので、southを使ってアプリのモデルチェンジを管理し始めることができます。実行する最も一般的なコマンドは python manage.py schemamigration app_name migration_name --auto で、最後に実行したマイグレーションを調べ、変更点を見つけ、マイグレーションファイルを作成します。次に、以下のコマンドを実行するだけです。 python manage.py migrate を実行するだけで、データベースを変更してくれます。

お役に立てれば幸いです。