Django为什么不使用“migrate”命令创建数据库表

2024-04-26 05:31:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django新手,出于某种奇怪的原因,我的模型没有创建数据库表,我完全不知道为什么。当我运行命令:“python manage.py makemigrations”时,控制台输出中将显示以下内容:

Migrations for 'auctions':
  auctions/migrations/0001_initial.py
  - Create model User
  - Create model Item

这对我来说似乎是准确的。然后我运行命令:“python manage.py migrate”,控制台输出中将显示以下内容

Operations to perform:
  Apply all migrations: accounts, admin, auctions, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.

查看数据库,确定没有创建任何内容。下面是my models.py文件的输出:

from django.contrib.auth.models import AbstractUser
from django.db import models



class User(AbstractUser):
    def __str__(self):
        return f"{self.first_name}"


class Item(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="item_list")
    title = models.CharField(max_length=64)
    description = models.CharField(max_length=256, blank=True)
    img_url = models.CharField(max_length=256, blank=True)
    starting_bid = models.DecimalField(decimal_places=2, max_digits=8)
    category = models.CharField(max_length=24, default='No Category')
    status = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.title}, {self.description}"

这是命令的输出:“python manage.py showmigrations”

Glass-Bids nobility$ python manage.py showmigrations
access
 (no migrations)
accounts
 [X] 0001_initial
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auctions
 [X] 0001_initial
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

enter image description here


Tags: namepy命令selfmanagemodelsmigrationslength
1条回答
网友
1楼 · 发布于 2024-04-26 05:31:59

是的,正如我所想。您可能遵循了某人的建议,即“删除所有迁移并删除表”,而现在在django_migrations表中仍然有一条记录,上面写着“0001_initial”,表示已应用拍卖应用程序。由于0001_initial是在没有迁移的情况下为应用程序多次创建的名称,因此您无法摆脱这种情况

因此,首先,使用您最喜欢的数据库工具删除有问题的行:

melvyn=# SELECT app, name FROM django_migrations WHERE name='0001_initial';
     app      |     name     
       +       
 contenttypes | 0001_initial
 auth         | 0001_initial
 admin        | 0001_initial
 sessions     | 0001_initial
 account      | 0001_initial
 sites        | 0001_initial
 main         | 0001_initial

所以在你的例子中:DELETE FROM django_migrations WHERE app='auctions';

现在,如果运行migrate,将应用迁移

下一次:如果给出的建议没有明确的解释,请不要删除所有迁移。这是一种浪费时间的行为,只能在有限的情况下起作用,而且往往是问题的根源

migrate命令还可以回滚迁移,因此如果您对任何迁移都不满意,请执行以下操作:

% python manage.py migrate auctions zero

(是的,字面意思是zero)。这将还原应用程序的所有迁移

如果你对最近的变化不满意,把它调回一个数字。因此,如果一个应用程序有3次迁移,请执行以下操作:

% python manage.py migrate auctions 0002

然后,您可以扔掉迁移0003,更改模型,再次运行makemigrations并再次迁移

这样,django关于应用迁移的假设与您的代码保持同步

相关问题 更多 >