web-dev-qa-db-ja.com

南への移行が機能しないのはなぜですか?

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

create database mydb;

インストールしたアプリに「南」を追加します。次に、このチュートリアルにアクセスします: 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")

だから私はグーグルを使用します(それは機能しません。したがって、870の質問がStackoverflowで尋ねられました)、私はこのページを取得します: 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を実行してから再度追加することです。

それはSO SILLY。

79
TIMEX

Southでは、新しいアプリで最初に起動したときにテーブルをまだデータベースに追加していないときに移行を作成できます。また、データベースに既にテーブルがある既存のアプリの移行を作成できます。重要なのは、いつ何をするかを知ることです。

最初の間違いは、移行を削除してすぐにsyncdbを実行したときでした。Django南にそのアプリを管理する必要があることを知らなかったため、最初の移行を作成してから移行を実行したとき、southはDjangoがすでに作成されているため、エラーが発生したテーブルを作成しようとしました。

この時点で、2つのオプションがあります。

  1. データベースからウォールアプリのテーブルを削除し、$ py manage.py migrate wallを実行します。これにより、移行が実行され、テーブルが作成されます。

  2. 最初の移行の実行を偽装する$ py manage.py migrate wall 0001 --fakeこれは、データベースに既にテーブルが存在することを南に伝えるので、それを偽装します。最初の移行が既に実行されていることを知ってください。

データベースなしで新しいプロジェクトを設定する

  1. データベースを作成する
  2. インストール済みアプリに南を追加
  3. syncdbを実行すると、Djangoおよびsouthテーブルがデータベースに追加されます
  4. アプリを追加する
  5. アプリごとにpython manage.py schemamigration app_name --initialを実行すると、アプリの初期移行ファイルが作成されます
  6. 次に、soute migrate python manage.py migrate app_nameを実行すると、データベースにテーブルが追加されます。

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

  1. インストール済みアプリに南を追加
  2. syncdbを実行します。これにより、soutsテーブルがデータベースに追加されます
  3. アプリごとにpython manage.py schemamigration app_name --initialを実行しますこれにより、初期移行が作成されます
  4. アプリを実行するたびにpython manage.py migrate app_name 0001 --fakeを実行しますが、これは南を偽装し、それらのモデルのデータベースには何もしません。次に、south_migrationhistoryテーブルにレコードを追加します。移行、あなたはすべて設定されています。

データベースなしでレガシープロジェクトを設定する

  1. データベースを作成する
  2. インストール済みアプリに南を追加
  3. アプリごとにpython manage.py schemamigration app_name --initialを実行しますこれにより、初期移行が作成されます
  4. syncdbを実行すると、移行のないアプリがデータベースに追加されます。
  5. 次に、South migrate python manage.py migrateを実行します。これにより、アプリのすべての移行が実行されます。

これで南を使用したセットアップが完了したので、南の使用を開始してこれらのアプリのモデル変更を管理できます。実行する最も一般的なコマンドはpython manage.py schemamigration app_name migration_name --autoで、これは最後に実行した移行を確認し、変更を見つけて移行ファイルを作成します。次に、python manage.py migrateを実行するだけで、データベースが変更されます。

それが役に立てば幸いです。

175
Ken Cochrane

これは私が物事を機能させる方法です。

pip install South

# add 'south', to INSTALL_APPS, then
python manage.py syncdb

# For existing project + database
python manage.py convert_to_south app_name

# Thereafter, call them per model changes
python manage.py schemamigration app_name --auto
python manage.py migrate app_name

参照:

http://garmoncheg.blogspot.com/2011/08/Django-how-and-why-to-use-migrations.htmlhttp://www.djangopro.com/ 2011/01/Django-database-migration-tool-south-explained /

10
CppLearner

使用しているチュートリアルは次のとおりです。

(south_migrationhistoryが存在しないという文句でこれが失敗した場合、syncdb Southのインストール後 を実行するのを忘れていました。)

投稿が行った手順を正確に詳述していると仮定すると、そのリンクをたどると、新しいアプリをセットアップする前に手順を逃したことが示されているようです。新しいアプリケーションで移行を設定するためのチュートリアルに従っている場合、順序は次のとおりです。

  1. southINSTALLED_APPSに追加します。
  2. syncdbを実行します。
  3. 次に、チュートリアルに従います

つまり、新しいアプリのモデルに追加する前に、すでにsyncdbを実行している必要があります。 INSTALLED_APPSからアプリを削除するソリューションは機能するはずですが、前の手順を逃したため、実際には「愚かな」回避策にすぎないことに注意してください。そのアプリのモデルを作成する前にsyncdbを実行していた場合、回避策を使用する必要はありません。

8
Andrew

将来の参考のために。サウスが問題を与えている場合:

  1. アプリディレクトリからmigrationsディレクトリを削除します
  2. データベースからSouth _ migrationsを削除します
  3. manage.py syncdbを実行します
  4. Southの使用に戻ります(例: './manage.py convert_to_south something、./manage.py migrate ...')
3
Sevenearths

これは明らかなようですが、ドキュメントを読むことを強くお勧めします。

この質問に対する答えを読んだ後でも、南を効果的に使用する方法を理解するのに苦労しました。

もちろん、私がドキュメントを読んだ日にすべてが変わったので、あなたもそうすべきです。Southはあなたが思うよりも使いやすいです。

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

私もこれが便利だと感じました:

http://www.djangopro.com/2011/01/Django-database-migration-tool-south-explained/

また、データベースのバージョン管理に関するJeff AtwoodのCoding Horrorの記事を必ずお読みください。

1
Ashley Davis

Southを機能させてすべてと正しく同期させるにはどうすればよいですか?考えられる唯一のことは、INSTALLED_APPSからアプリを削除し、syncdbを実行してから、再度追加することです。

私は過去に南のトラブルでその修正を使用しました。きれいな解決策ではありませんが、非常に効果的です;)

しかし、主な問題は、注文が正しくないことです。チュートリアルの前にsyncdbを実行しておく必要があります。それが適切に機能するより。

0
Wolph