2011-01-29 9 views
5
$ py manage.py migrate turkey 
Running migrations for turkey: 
- Migrating forwards to 0001_initial. 
> turkey:0001_initial 
! Error found during real run of migration! Aborting. 

! Since you have a database that does not support running 
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations. 

! You *might* be able to recover with: = DROP TABLE `turkey_demorecs` CASCADE; [] 

! The South developers regret this has happened, and would 
! like to gently persuade you to consider a slightly 
! easier-to-deal-with DBMS. 
! NOTE: The error which caused the migration to fail is further up. 

私は試して何らかの理由でこれを取得します。 しかし私の他の設定はMyISAMにあります。Djangoの南(移行ツール)はinnodbで動作しますか?

なぜInnodbでは動作しませんか?

答えて

1

はい、サウスはInnoDBをサポートしています。あなたの "migrations"フォルダの内容を削除し、schemamigrationを再実行し、移行して、ここに0001_initialファイルの結果と内容を投稿できますか? PS:マイグレーションフォルダがバックアップされていることを確認してください。

rm -fr app/migrations/* 
./manage.py schemamigration app --initial 
./manage.py migrate app 
3

も参照してくださいhttps://code.djangoproject.com/wiki/AlterModelOnSyncDB

そのデフォルトテーブルのストレージエンジンはMyISAMテーブルであると私はで見つかったレシピを使用して(InnoDBテーブルを使用していたMySQLの設定で作業するとき、私は、エラーの同じ種類が私に起こるあった

上記のリンクでは、post_syncdb信号を使用してコンバージョンコードをトリガーしました)。しかし、新しいテーブルを作成するためにSouthを使用する場合、MyISAMエンジンを使用して最初に作成され、その後変換されました。私は、InnoDBテーブルが実際にMyISAMだったときに想定していたことをやっていないと誤って信じていました。テーブルは信号によって変換されたため、任意の移行エラーが適用を解除するために失敗します: -/

デフォルトはMyISAMテーブルでInnoDBテーブルを使用するか、作成する必要がある場合、これはで解決する:

# add at the beginning of your migration 
if db.backend_name == 'mysql': 
    db.execute('SET storage_engine=INNODB') 

パフォーマンスヒットを気にしない場合:

+0

本当ですか?元のエラーはありません。 – Tobu

+0

私は、デフォルトでMyISAMを使用するように設定されたmysqlを使って作業しているときに、サウスに私に同じような '使いやすいDBMSを使用する'メッセージを与えました。私は確信することはできませんが、おそらく同じ問題です。 – dnozay

4

InnoDBには外部キーに制約があり、移行の際にデータベースモデルを破壊しないようにします。あなたが得ることはありません、MyISAMテーブルがあなたのFK関係を確認していないので

(あなたがhttp://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.htmlを行う行うことを選択した場合、あなたはこれを実装することができそうですが)

のMyISAMは制約をネイティブサポートしていません(http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.htmlを参照してください)エラー。ただし、InnoDBはチェックを行っており、移行に問題があるようです。

1

あなたはあなたの最初の移行に追加してみてください:

if db.backend_name == 'mysql': 
    db.execute('SET foreign_key_checks=0') 

これは、外部キーチェック制約を無効にします。

セッション変数なので、1に戻す必要はありません。

ところで、南にはSQLが生成されているため、マイグレーションメソッドの最後に1に戻っても、それが戻ったときに実行されるため、これは機能しません。

関連する問題