python manage.py syncdb"未创建表格

7 投票
6 回答
13978 浏览
提问于 2025-04-18 03:52

我首先运行了

python manage.py syncdb

这条命令,它为我创建了数据库和表格。然后我想添加更多的应用程序,接下来我做了以下操作:

通过下面的命令创建应用:

python manage.py startapp newapp

然后我在设置文件 setting.py 中把 'newapp' 加入到 INSTALLED_APPS 里:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'newapp',
)

最后我运行了 syncdb

python manage.py syncdb

然后我得到了这个结果:

Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

我检查了我的数据库,发现没有名为 newapp 的表格,也没有任何表格的名字包含 newapp

6 个回答

0

我之前也遇到过同样的问题,发现它创建了一个名为 db.sqlite3 的文件,这个文件看起来并不是空的:

$ ls -l
-rw-r--r--   1 sauron  staff  122880 Jul 31 01:22 db.sqlite3

我尝试再次运行 sqlite,并把这个文件名作为参数传进去,这样就成功了:

$ sqlite3 db.sqlite3 
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE "auth_group" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(80) NOT NULL UNIQUE
);
... many rows ...
1

我也遇到了同样的问题,不过我没有找到任何“迁移”文件夹。我是这样解决的。

我只是给模型代码加上了 app_label

class MyModel(models.Model):
...
    class Meta:
        managed = True      # add this
        app_label = 'myapp' # & this

另外,确保它可以被找到,可以在 myapp/models/__init__.py 中引用它。

from model_file.py import MyModel
4

我尝试了上面大部分的想法:

  • 确保 models.py 被导入(确认在执行 makemigrate 时模块确实运行了),
  • 删除 migrations 文件夹,
  • 设置 managed = True(反正这个是默认的),
  • 使用 python manage.py inspectdb(这能正确显示表格,如果我手动创建过的话)。

关键是要单独对 app 运行 makemigrations

python manage.py makemigrations <app_name>

作为执行 makemigrations 步骤的一部分。然后你照常执行:

python manage.py migrate

(适用于 Django 1.10,使用 Postgres 9.5)。

Django 文档

相关帖子

6

我也遇到过这个问题,后来我通过删除我应用里的迁移文件夹来解决了这个问题。这个文件夹不知怎么就被创建了,导致syncdb误以为所有的迁移都已经完成了,但实际上那些迁移脚本并没有做什么有用的事情。显然,如果你有想要保存的迁移,千万不要这样做。不过我当时是在处理一个全新的应用和模型。

4

如果你运行:

python manage.py inspectdb > somefile.txt

你可以快速检查一下你的数据库结构是否和你的Django模型相匹配。

撰写回答