近期在适用django+xadmin做一个开发,但是在makemigrations和migrate之后,显示创建或更改了字段,数据库中缺没有创建或更改。
第一种解决办法:
删migrations目录、django_migrations中相关记录,然后执行
python manage.py makemigrations appname
python manage.py migrate
#或
python manage.py migrate --fake appname
#基本上就能解决问题了。
但是,总是有但是。一次由于不小心,多删了django_migrations中记录,就试着干脆直接把表给干掉重新迁移得了,然后就是屡次的失败失败......这就有了第二种方案
第二种解决办法:
把整个数据库清空或重建(心里一万个草泥马啊,)然后老套路makemigrations/migrate,然后就是各种数据表缺失don't exist。然后一边百度一个一个appmigrate,最终才算弄好。为何重新删库、删记录文件后,不会自动一下子迁移成功呢?
第三种解决办法:
当数据库不在需要时(如表中参照性完整性、实体性完整性和用户自定义完整性需要修改的时候)(相当于drop数据库),我们可以利用migrate来重建数据库,而不需要去数据库中写原生SQL语句来建立数据库。
1、python manage.py db init
2、python manage.py db migrate -m "initial migration"
3、python manage.py db upgrade
当数据库表有更新时,需要执行
python manage.py inspectdb > appname/models.py
python manage.py makemigrations
python manage.py migrate
这个方法没有试,比较郁闷所以就直接采用第四种了。
第四种解决办法:
这是在无奈之无奈花了两个晚上的时间,终于借助sql解决了。
因为在makemigrations的时候,生成的0001_initial.py文件里面就是models中的相应的字段和表,这就是最终的models。但为何没有执行?反正是没有找到为何没执行,在群里问了几个大神,貌似也没人理会这事儿。最后终于在翻看makemigrations的时候发现了sqlmigrate命令。
python manage.py sqlmigrate appname 迁移文件编号 #此处文件全名为0001_initial.py,则只写0001即可,多了不认。
然后把BEGIN;COMMIT;之间的sql语句在sql管理工具或命令行中运行即可。如下:
D:\GeoSystem>python manage.py sqlmigrate project 0001
System check identified some issues:
WARNINGS:
?: (urls.W005) URL namespace 'xadmin' isn't unique. You may not be able to reverse all URLs in this namespace
BEGIN;
--
-- Create model AddProject
--
CREATE TABLE `project_addproject` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `tempname` varchar(300) NOT NULL, `workload` varchar(300) NOT NULL, `monovalent` varchar(20) NOT NULL, `total` varchar(20) NOT NULL, `status` varchar(20) NOT NULL, `addtime` datetime(6) NOT NULL, `isSign` bool NOT NULL, `isDo` bool NOT NULL);
--
-- Create model Category
--
CREATE TABLE `project_category` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(50) NOT NULL, `desc` varchar(100) NOT NULL, `sort` integer NOT NULL, `is_root` bool NOT NULL, `is_abort` bool NOT NULL, `parent_id` integer NULL);
--
-- Create model Opinion
--
CREATE TABLE `project_opinion` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `sort` varchar(50) NOT NULL, `flow` varchar(50) NOT NULL, `content` longtext NOT NULL, `addtime` datetime(6) NOT NULL, `reply` longtext NOT NULL, `replytime` datetime(6) NOT NULL, `desc` longtext NOT NULL, `examiner_id` integer NOT NULL);
--
-- Create model ProjectList
--
CREATE TABLE `project_projectlist` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(300) NOT NULL, `projectno` varchar(50) NOT NULL, `isroot` bool NOT NULL, `status` varchar(50) NOT NULL, `addtime` datetime(6) NOT NULL, `starttime` datetime(6) NOT NULL, `overtime` datetime(6) NOT NULL, `desc` longtext NOT NULL, `category_id` integer
NOT NULL, `company_id` integer NOT NULL);
CREATE TABLE `project_projectlist_completer` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `projectlist_id` integer NOT NULL, `userprofile_id` integer NOT NULL);
--
-- Create model ReportList
--
CREATE TABLE `project_reportlist` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `partname` varchar(300) NOT NULL, `elevation0` integer NOT NULL, `designedelevation` integer NOT NULL, `depth` integer NOT NULL, `starttime` datetime(6) NOT NU