まず、データベースを作成します。
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。
Southでは、新しいアプリで最初に起動したときにテーブルをまだデータベースに追加していないときに移行を作成できます。また、データベースに既にテーブルがある既存のアプリの移行を作成できます。重要なのは、いつ何をするかを知ることです。
最初の間違いは、移行を削除してすぐにsyncdbを実行したときでした。Django南にそのアプリを管理する必要があることを知らなかったため、最初の移行を作成してから移行を実行したとき、southはDjangoがすでに作成されているため、エラーが発生したテーブルを作成しようとしました。
この時点で、2つのオプションがあります。
データベースからウォールアプリのテーブルを削除し、$ py manage.py migrate wall
を実行します。これにより、移行が実行され、テーブルが作成されます。
最初の移行の実行を偽装する$ py manage.py migrate wall 0001 --fake
これは、データベースに既にテーブルが存在することを南に伝えるので、それを偽装します。最初の移行が既に実行されていることを知ってください。
python manage.py schemamigration app_name --initial
を実行すると、アプリの初期移行ファイルが作成されますpython manage.py migrate app_name
を実行すると、データベースにテーブルが追加されます。python manage.py schemamigration app_name --initial
を実行しますこれにより、初期移行が作成されますpython manage.py migrate app_name 0001 --fake
を実行しますが、これは南を偽装し、それらのモデルのデータベースには何もしません。次に、south_migrationhistoryテーブルにレコードを追加します。移行、あなたはすべて設定されています。python manage.py schemamigration app_name --initial
を実行しますこれにより、初期移行が作成されますpython manage.py migrate
を実行します。これにより、アプリのすべての移行が実行されます。これで南を使用したセットアップが完了したので、南の使用を開始してこれらのアプリのモデル変更を管理できます。実行する最も一般的なコマンドはpython manage.py schemamigration app_name migration_name --auto
で、これは最後に実行した移行を確認し、変更を見つけて移行ファイルを作成します。次に、python manage.py migrate
を実行するだけで、データベースが変更されます。
それが役に立てば幸いです。
これは私が物事を機能させる方法です。
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 /
使用しているチュートリアルは次のとおりです。
(south_migrationhistoryが存在しないという文句でこれが失敗した場合、syncdb Southのインストール後 を実行するのを忘れていました。)
投稿が行った手順を正確に詳述していると仮定すると、そのリンクをたどると、新しいアプリをセットアップする前に手順を逃したことが示されているようです。新しいアプリケーションで移行を設定するためのチュートリアルに従っている場合、順序は次のとおりです。
INSTALLED_APPS
に追加します。syncdb
を実行します。つまり、新しいアプリのモデルに追加する前に、すでにsyncdb
を実行している必要があります。 INSTALLED_APPS
からアプリを削除するソリューションは機能するはずですが、前の手順を逃したため、実際には「愚かな」回避策にすぎないことに注意してください。そのアプリのモデルを作成する前にsyncdb
を実行していた場合、回避策を使用する必要はありません。
将来の参考のために。サウスが問題を与えている場合:
- アプリディレクトリからmigrationsディレクトリを削除します
- データベースからSouth _ migrationsを削除します
- manage.py syncdbを実行します
- Southの使用に戻ります(例: './manage.py convert_to_south something、./manage.py migrate ...')
これは明らかなようですが、ドキュメントを読むことを強くお勧めします。
この質問に対する答えを読んだ後でも、南を効果的に使用する方法を理解するのに苦労しました。
もちろん、私がドキュメントを読んだ日にすべてが変わったので、あなたもそうすべきです。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の記事を必ずお読みください。
Southを機能させてすべてと正しく同期させるにはどうすればよいですか?考えられる唯一のことは、INSTALLED_APPSからアプリを削除し、syncdbを実行してから、再度追加することです。
私は過去に南のトラブルでその修正を使用しました。きれいな解決策ではありませんが、非常に効果的です;)
しかし、主な問題は、注文が正しくないことです。チュートリアルの前にsyncdbを実行しておく必要があります。それが適切に機能するより。