web-dev-qa-db-fra.com

django.db.utils.NotSupportedError dans sqlite pourquoi pas pris en charge dans 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)

erreur:

Django.db.utils.NotSupportedError: renommer la table 'posts_file' lors d'une transaction n'est pas pris en charge sur SQLite car cela romprait l'intégrité référentielle. Essayez d'ajouter atomic = False à la classe de migration.

comment résoudre cette erreur

3
유재영

accédez au fichier de migration associé (créé automatiquement dans le répertoire de migration après la commande makemigrations) et ajoutez atomic = False après class Migration(migrations.Migration): pour pouvoir migrer les modifications.

11
Selim Yılmaz

Si vous avez toujours le problème, voici un exemple: 

# 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',
        ),
    ]
2
Rodrigo

Si vous ne voulez rien toucher et que vous venez de commencer votre projet (enfin, pas nécessairement), vous pouvez simplement supprimer les fichiers de migration du répertoire de migration et migrer à nouveau.

Sinon, remplacez la variable atomic dans le fichier de migration par False pour pouvoir migrer vos modifications.

2
Ismail El Hachimi

J'ai migré plusieurs fois après avoir eu cette erreur.

Ensuite, j'ai fait ce que Selim a dit ci-dessus et j'ai également ajouté atomic = False après class Migration(migrations.Migration): dans chaque fichier de migration, ce qui était un peu ridicule, car je ne savais pas quel fichier était LE fichier de migration associé ...

Ensuite, j'ai cherché "atomique = Faux" dans la documentation de Django et j'ai trouvé ceux-ci: 12

Comme l'erreur " Renommer la table 'posts_file' lors d'une transaction n'est pas prise en charge sur SQLite ", nous savons que le changement de nom pendant une transaction n'est pas pris en charge sur SQLite. Il est donc nécessaire d'ajouter atomic=False. Mais je ne connais pas les transactions DDL, donc c'est trop pour moi ...

1
veranopolestar