【问题标题】:Django don't create new sqlite table for new app modelDjango 不会为新的应用模型创建新的 sqlite 表
【发布时间】:2023-04-02 02:14:02
【问题描述】:

对 Django 来说还很陌生,我遇到了一个新模型(以及我制作的新应用程序“博客”)的问题。配置模型并 makemigration 后,表 blog_post 不存在。

这是我所做的所有过程。我正在关注官方教程:

这是我的博客/models.py:

from django.db import models

    class Post(models.Model):
        title = models.CharField(max_length=80)
        text = models.TextField()
        author = models.ForeignKey('auth.User', on_delete= models.CASCADE)
        created_date = models.DateTimeField()
        pub_date = models.DateTimeField()

    def publish():
        self.pub_date = timezone.now()
        self.save()

mysite/settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig',
]

在第一个之后

python manage.py makemigrations 博客

Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model Post

python manage.py sqlmigrate blog 0001

BEGIN;
--
-- Create model Post
--
CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,     "title" varchar(80) NOT NULL, "text" text NOT NULL, "created_date" datetime NOT NULL, "pub_date" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
COMMIT;

python manage.py 迁移

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

所以,就是这样。似乎没有创建新表。我检查了一个 Sqlite 实用程序,但没有这样的表:blog_post 我还检查了 django shell。

我双重(三重)检查过程:

  1. 更改您的模型(在 models.py 中)。
  2. 运行 python manage.py makemigrations 为这些更改创建迁移
  3. 运行 python manage.py migrate 以将这些更改应用到数据库

但我被困在这一点上。有人可以告诉我我错过了什么吗?谢谢!

这是我的数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

python manage.py showmigrations

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
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
blog
 [X] 0001_initial
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

我使用 DB Browser for SQLite 检查表是否存在,但 blog_post 不存在。

github 仓库链接:https://github.com/mothinx/juliengracia

【问题讨论】:

  • 您是否尝试过在命令中不包含blog 的情况下运行python manage.py makemigrations
  • 结果是没有检测到变化。
  • 迁移已创建但未应用。 python manage.py migrate blog 应该这样做。
  • 您确定该表不存在吗?你怎么检查?你的数据库设置是什么?你在哪里运行这段代码?
  • manage.py showmigrations 的结果是什么?

标签: python django


【解决方案1】:

showmigrations 的输出表明 Django 认为初始博客迁移已运行。

blog
 [X] 0001_initial

sqlmigrate 输出显示迁移应该已经创建了表。因此看起来django_migrations 文件夹和数据库似乎不同步。

您可以尝试通过伪装回零迁移来重新运行初始迁移。

python manage.py migrate --fake blog zero
python manage.py migrate blog

如果这不起作用,并且您的数据库中没有任何重要数据,您可以删除db.sqlite3 文件并再次运行python manage.py migrate

【讨论】:

  • python manage.py migrate --fake blog zero 成功了。对于我的文化,这个选项 --fake 粉碎了创建 django 虽然表的事实?非常感谢!
  • 很高兴这有效。我不确定我是否理解您的后续问题。如果你做了python manage.py migrate blog zero(没有--fake),那么Django 会尝试通过删除表来逆转迁移。那会失败,因为表不存在。您使用--fake 以便Django 更新django_migrations 表而不尝试更新数据库。然后当你运行python manage.py migrate blog时,它会运行0001_initial迁移并创建表。
【解决方案2】:
python manage.py migrate --fake APPNAME zero

然后你就可以运行迁移脚本了

python manage.py migrate 

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    我只使用以下内容:

    python manage.py makemigrations
    python manage.py migrate
    

    【讨论】:

    • 如果问题出在缩进上,manage.py 命令中的任何一个(或几乎没有)都行不通,尤其是makemigrations
    • 那我猜是复制粘贴代码的问题。我的错。我将删除我的答案。
    猜你喜欢
    • 2016-06-16
    • 2021-10-18
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多