【问题标题】:django 1.7 migrate gets error "table already exists"django 1.7 迁移出现错误“表已存在”
【发布时间】:2014-11-13 12:19:44
【问题描述】:

我正在尝试应用迁移,但出现错误:

django.db.utils.OperationalError: (1050, "Table 'customers_customer' 已经存在”)

我通过发出以下命令得到这个:

python manage.py migrate

我的客户表已经存在,那么我该怎么做才能让迁移知道这一点,而不是出错,然后运行我对模型的修改?

我在本地环境中使用本地数据库运行此程序,没有问题。当我将我的数据库指向生产并在上面运行migrate 时,我收到了这个错误。

【问题讨论】:

  • 一个问题 - 对于 django 1.7,您不应该使用 django 迁移而不是南吗?
  • 该错误是 django 迁移错误。
  • @karthikr 我正在使用 django 迁移。我在这个问题上使用了南标签,因为我认为该社区中的某个人可能知道答案。
  • 我想我遇到了类似的问题。如果您运行 python manage.py syncdb 然后稍后运行 manage.py migrate,它会导致,因为 syncdb 也有点创建这些表。推荐的方法是运行它,假设您没有数据库:python manage.py migrate 。然后如果你想创建超级用户,你可以执行 python manage.py createsuperuser。
  • 我也有同样的问题。到目前为止没有任何效果。看来我通过删除迁移目录和数据库文件杀死了一种机制。我认为删除这些文件可以,从头开始,但显然不是。

标签: django django-south django-1.7 django-migrations


【解决方案1】:

如果你已经在数据库中创建了表,你可以运行

python manage.py migrate --fake <appname>

将迁移标记为已运行而不实际运行

或者如果你想在你的迁移中避免一些操作,你可以编辑 app/migrations 目录下的迁移文件,并在迁移执行中注释你不想做的操作。

文档:https://docs.djangoproject.com/en/1.8/topics/migrations/#upgrading-from-southpython manage.py help migrate

【讨论】:

  • ^在 Django 1.11 中工作
  • 我希望不会因此而出现问题
【解决方案2】:

其实是python manage.py migrate --fake &lt;appname&gt;

【讨论】:

    【解决方案3】:

    我们可以通过答案中提到的两种方式解决此问题: 1.) 通过在迁移文件中编辑

    我们在我们创建的每个应用程序中都创建了迁移文件夹,在 那些迁移文件夹迁移文件(0001_initial.py 是 最初创建,之后所有其他文件都依赖于此 初始文件将被创建),当我们运行 python manage.py migrate,对于每个APP,如果有迁移文件将适用 文件中的更改。我们可以看到这个运行之后在终端上应用 迁移命令。如果迁移文件中有任何问题,我们会使用它来获取 那时的错误。在我/我们的情况下:

    Applying ValetUser.0002_keyroundslots_systemparameters_vehicleparking_vehicleparkingdetails...Traceback (most recent call last):
    sqlite3.OperationalError: table "valet_keyroundslots" already exists
    

    在这里我们可以注意到提到了我们有问题的文件 即 ValetUser.0002_keyroundslots_systemparameters,所以我们可以去 应用程序,然后迁移,在 0002 文件中我们可以评论 我们面临问题的那个特定模型的 CreateModel 操作 应用迁移。 示例:

    operations = [
        # migrations.CreateModel(
        #     name='KeyRoundSlots',
        #     fields=[
        #         ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
        #         ('key_round', models.IntegerField()),
        #         ('key_slot', models.IntegerField()),
        #         ('is_available', models.BooleanField()),
        #         ('Valet_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='valet_location', to='ValetUser.ValetAt')),
        #     ],
        #     options={
        #         'db_table': 'valet_keyroundslots',
        #     },
        # ),
    

    2.) 通过对我们面临错误/问题的特定 APP 的已修改迁移文件应用虚假迁移,--fake 将 应用不会影响已应用的虚假迁移 模型迁移。

    python manage.py migrate --fake <appname>
    

    Waqas 和 elmonkeylp 给出的答案也是正确的,我只是想 在我们使用场景的帮助下简要解释一下

    【讨论】:

    • @elmonkeylp 为什么不删除引起问题的整个文件而不是评论其部分?
    猜你喜欢
    • 2015-02-09
    • 2015-03-31
    • 2019-11-17
    • 1970-01-01
    • 2014-11-13
    • 2014-12-13
    • 1970-01-01
    • 2015-10-17
    • 2018-01-08
    相关资源
    最近更新 更多