django基本命令:比如清表
https://code.ziqiangxuetang.com/django/django-basic.html
ProgrammingError: relation "django_content_type" already exists
使用--fake-initial有时可能会对项目的初始迁移造成麻烦
python manage.py migrate --fake-initial
它在1.8中是新的。在1.7中, - 初始默认是默认的,但在1.8中是明确的。
从文档:
如果所有具有由该迁移中的所有CreateModel操作创建的所有模型的名称的数据库表已经存在,那么可以使用--fake-initial选项来允许Django跳过应用程序的初始迁移。此选项适用于首次针对预先使用迁移的数据库运行迁移时使用。但是,此选项不会检查匹配的表名以外的匹配数据库模式,因此只有在确信现有模式与初始迁移中记录的内容匹配时才可以使用。
https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---fake-initial
makemigrations指令是用models里面的model和当前的migrations代码里面的model做对比,如果有新的修改,就生成新的migrations代码,migrate指令是用migrations目录中代码文件和django数据库djaong_migrations表中的代码文件做对比,如果表中没有,那就对这些没有的文件按顺序及依赖关系做migrate apply,然后再把代码文件名加进migrations表中。
django.db.utils.ProgrammingError: (1146, "Table ‘test.model_student‘ doesn‘t exist")
数据迁库:清除py文件,但是保留文件夹;然后就可以一步到位。
python manage.py migrate --fake
这个命令是不能解决任何问题的
一、现象
在数据库中删除了一张表,重新执行python manage.py migrate时出错,提示不存在这张表。
二、原因
主要是因为django一般在第一次迁移的时候新建表,后面的都不会新建表,而是只检查字段等等的变化,所以我们既然已经删除了这张表,django检查这张表的字段变化的时候就自然报错了。
三、解决办法
解决办法仍然是执行python manage.py makemigrations和python manage.py migrate,只不过在执行这个之前,把第一次执行迁移创建表的那个记录删除掉,否则它检测到已经执行过第一次了,那么它后面就不会创建表了。
(1)在该app模块下,有一个migrations文件夹,除了前两个文件外,其他的文件都删除,其实每一次如果有变化的话,这边就会生成一个文件,下面这个001_initial.py看名字就知道是第一次迁移的时候生成的,也就是因为有它的存在,所以以后每次再执行就不再创建表了。
(2)其次,在数据库里面也有相应的记录,也要删除。我们仔细看看数据库里面存的是什么,在django_migrations里面,这个表里面存的都是每次迁移的记录,当然记录的是什么模块以及对应的文件名字,比如我们这里的模块是dtheme,这里的文件名叫001_initial,和我们文件夹里面是一一对应的,同样,删除这条记录。
然后再执行python manage.py makemigrations和python manage.py migrate就可以了。需要注意的是,如果这个app模块下面还有其他的model的话,那么其他model创建的表也要删除掉,相当于我们这样的解决方案是针对整个app模块的,要执行就会全部重新生成,不然会提示部分表已经存在的错误。