web-dev-qa-db-ja.com

sqliteのdjango.db.utils.NotSupportedErrorがsqliteでサポートされない理由

class M_Post(models.Model):
''''
CODE
''''
class M_File(models.Model):
....
CODE
....

class M_Post_File(models.Model):
    post = models.ForeignKey(M_Post,on_delete=models.CASCADE)
    file = models.ForeignKey(M_File,on_delete=models.CASCADE,null=True)

エラー:

Django.db.utils.NotSupportedError:トランザクション中に 'posts_file'テーブルの名前を変更することは、参照整合性を損なうため、SQLiteではサポートされていません。 atomic = FalseをMigrationクラスに追加してみてください。

このエラーを解決する方法

9
유재영

関連する移行ファイル(makemigrationsコマンドの後にmigrationsディレクトリに自動的に作成される)に移動し、_atomic = False_をMigrationクラスに追加します。 Migration(migrations.Migration):。その後、変更を移行できます。

18
Selim Yılmaz

それでも問題が解決しない場合の例を次に示します。

# Generated by Django 2.1 on 2018-08-16 21:22

from Django.db import migrations


class Migration(migrations.Migration):
    atomic = False # <<<< THIS LINE

    dependencies = [
        ('shop', '0004_product_imgfeat'),
    ]

    operations = [
        migrations.RenameModel(
            old_name='Category',
            new_name='CategoryShop',
        ),
    ]
14
Rodrigo

このエラーが発生した後、何度も移行しました。

次に、セリムが上記のことを行い、すべての移行ファイルでclass Migration(migrations.Migration):の後にatomic = Falseを追加しました。

次に、Djangoドキュメンテーションで "atomic = False"を検索し、これらを見つけました: 12

エラー「トランザクション中の「posts_file」テーブルの名前変更はSQLiteではサポートされていません」で説明したように、トランザクション中の名前変更はサポートされていませんSQLiteでは、atomic=Falseを追加する必要があります。しかし、私はDDLトランザクションについて知らないので、それは私にとってはやりすぎです...

3
veranopolestar

何も触れたくなく、プロジェクトを開始したばかりの場合(必ずしもそうではありません)、migrationsディレクトリ内の移行ファイルを削除して、再度移行することができます。

それ以外の場合は、移行ファイルのatomic変数をFalseに変更してから、変更を移行できます。

2

別の方法として、atomic = falseメソッドが機能しなかった場合は、移行フォルダー内の生成されたファイルを削除し、移行を行って移行することでやり直すことができます

1
Khyar Ali