Django 1.8 migrate不会创建表

时间:2015-10-12 16:57:33

标签: python django

yekabathula-macbookair2:roster yekabathula$ python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, api, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying api.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying sessions.0001_initial... OK
yekabathula-macbookair2:roster yekabathula$ python manage.py syncdb
/Library/Python/2.7/site-packages/django/core/management/commands/syncdb.py:24: RemovedInDjango19Warning: The syncdb command will be removed in Django 1.9
  warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)

Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, api, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  No migrations to apply.

在执行python manage.py migrate之后,我的models.py不会在数据库中创建表,它可以从django_session等创建其他表。还有什么我需要遵循的吗?

18 个答案:

答案 0 :(得分:80)

我在Django 1.10中遇到了类似的问题,上述解决方案都没有为我工作。

最终运行的是运行此命令:

python manage.py migrate --fake myappname zero

这会重置所有迁移(到第0个状态)

接下来是:

python manage.py migrate myappname

为我创建了表格。

如果您不想回滚到初始(零)状态但是要说迁移号码0005(上次迁移有效),您可以改为:

python manage.py migrate --fake myappname 0005

然后继续进行实际迁移:

python manage.py migrate myappname

docs

中的更多详细信息

答案 1 :(得分:15)

在我的情况下,APP / migrations /文件夹中缺少__init__.py文件。如果您没有,则只需要一个空的__init__.py文件。

答案 2 :(得分:5)

我遇到了同样的问题。 经过大量的挖掘,我找到了解决方案。 我使用的是django 1.11,

如果你想重新开始,

1)delete all the files in your migrations folder except __init__.py
2)drop database
3)create database
4)python makemigrations
5)python migrate

如果你有reset_db,而不是第二和第三步,你可以使用reset_db。

  

python manage.py reset_db

答案 3 :(得分:3)

我有一个类似的问题,只是弄明白了。我有多个数据库。我的本地(未更新的)是MySQL数据库。其他是MS SQL Server和MySQL。我有其他数据库的路由器,因为我不管理它们并且(在Django 1.6中)使用路由器来指示allow_sync()= False。使用1.7,我将其更改为allow_migrate()= False。但我没有为我的本地数据库添加路由器。默认情况下似乎是allow_migrate()= False(如果没有)。结果,迁移失败了(参考:https://docs.djangoproject.com/en/1.7/topics/db/multi-db/)。我为我的本地数据库添加了一个路由器,设置allow_migrate()以返回True,现在我的迁移实际上创建了我的表。

答案 4 :(得分:2)

试试这个,

运行,

python manage.py makemigrations app_name 
<块引用>

上面的命令将进行迁移,如果成功则运行第二个命令或 检查 Installed_app 中是否有拼写错误,并检查 AppConfig 模块

python manage.py migrate app_name
<块引用>

如果上面成功,这将在db中创建表

答案 5 :(得分:2)

我有一个类似的问题。我做了上述所有工作,但没有任何效果。然后我意识到我没有在我的应用程序的[None]文件中添加模型名称。

除了上述所有内容外,您还必须在admin.py文件中添加模型名称。您必须像这样添加它:

admin.py

答案 6 :(得分:1)

这解决了我的问题(我顺便使用MySQL工作台):

  • 运行此sql: var viewSize = Double(viewersView.frame.size.width) var itemSize = Double(boxSize + viewerHorizontalPadding) self.maxViewers = floor(viewSize / itemSize) //should be Int
  • 选择 django数据库中的所有表格(单击第一个表格,然后按住shift键,然后单击最后一个表格)。然后右键单击并选择&#34; Drop n tables&#34; (其中n是您刚刚选择的表的数量)
  • 然后运行SET FOREIGN_KEY_CHECKS = 0;
  • 最后通过运行此sql来恢复外键检查设置:python manage.py migrate

注意:在采取这一极端措施之前,我尝试了Paulo Pessoa在评论中所说的内容,但我仍然没有进行迁移。&#34;消息。但是,这解决了这个问题。

答案 7 :(得分:1)

  1. 如果您只想为您的应用程序而不是所有应用程序执行此操作,请清除数据库中“ django_migrations”表中的应用程序迁移记录。
  2. Python manage.py makemigrtions
  3. python

答案 8 :(得分:1)

问题::第一次在django中应用迁移时,django在数据库中创建该模型的表并在其中标记某处自己的文件(类):

gsl::span
  • 然后尝试更改该表的架构时,它将首先检查 如果number_of_indices

  • 如果未找到“初始”类属性,则将迁移视为“ “初始”

  • 如果我们需要使用`initial = True`

    initial = True

对于初始迁移,Django检查所有这些表是否已存在于数据库中,如果存在,则对迁移进行假应用。同样,对于添加一个或多个字段的初始迁移,Django会检查数据库中是否已存在所有相应的列,如果存在,则将其伪造。

伪初始迁移同时使用CreateModel()和AddField()方法。


解决方案

initial = True

答案 9 :(得分:1)

  • 删除模型的现有表格。

  • 删除app文件夹下的迁移文件夹。

  • 删除表格中的所有相关迁移记录 “django_migrations”。

  • 现在您可以获得清晰的模型和数据库。使用makemigrations并迁移 创建表。

希望能帮到你。

答案 10 :(得分:0)

我正在使用MySQL,并删除了0001_initial.py迁移文件,并且所有自定义表都是从DB演化而来的,以尝试重新生成它们的所有表...

已解决,此问题只是删除django_migrations表中的这些行...

enter image description here

然后,$ python manage.py migrate命令再次重新生成我的所有自定义表。

答案 11 :(得分:0)

为避免删除关键数据库,您还可以考虑使properties下面的Class Meta:保持沉默,例如以下模型:

class Blog(models.Model):
    category = models.CharField(max_length=100)
    title = models.CharField(max_length=100)
    date_added = models.DateTimeField()
    merits = models.CharField(max_length=300, blank=True)
    demerits = models.CharField(max_length=300, blank=True)
    class Meta:
        managed = True
        db_table = 'weblog'
        verbose_name_plural = "Blog"

    @property
    def content_min(self):
        return truncatechars(self.content, 50)

然后您可以运行makemigrationsmigrate,表将被创建。

答案 12 :(得分:0)

在models.py中更改为托管= True(如果设置为False)

class Meta:
    managed = False
    db_table = 'table_name'

收件人

class Meta:
    managed = True
    db_table = 'table_name'

答案 13 :(得分:0)

这可能非常令人沮丧,但这是对我有用的方法。 首先,如果您已删除迁移文件,请继续并重新创建

python manage.py makemigrations

然后将迁移文件与SQL原始代码进行比较,如果合适,则应用迁移

python manage.py sqlmigrate [app_name] 0001
python manage.py migrate

或者您可以简单地从命令行或终端通过管道

python manage.py sqlmigrate [app_name] 0001 | [psql] db_name username

BEGIN
CREATE TABLE
ALTER TABLE
COMMIT

注意:就我而言,我使用的是postgresql。尽管引擎与其他数据库语言类似,但是您可能无法获得预期的结果。

答案 14 :(得分:0)

  1. 在settings.py中从sqlite3更改为mysql
  2. 确保您具有有关数据库名称和用户名密码的正确信息
  3. 删除现有迁移
  4. 进行迁移
  5. 然后迁移

答案 15 :(得分:0)

确保每个应用程序的迁移文件夹都有一个__init__.py文件。

答案 16 :(得分:0)

  1. 删除数据库
  2. 删除migration文件夹
  3. 运行migrate命令
  4. 运行makemigrations命令
  5. 运行migrate命令

它将完美地创建所有表

答案 17 :(得分:0)

我遇到了类似的问题,与 DB 的连接设置正确,因为所有 django 管理表都是在 DB 端创建的。但是models.py中没有出现模型

对我有用的是在控制台中运行:

python manage.py inspectdb > models.py

它将所有内容写入一个新的 models.py 文件,然后我将其替换为我在 app 文件夹中的文件。然后我可以改变 托管 = 错误 进入 管理 = 真

此处是文档链接:https://docs.djangoproject.com/en/3.1/howto/legacy-databases/