django数据库迁移需注意的问题

django迁移

django迁移就是在django的models.py中创建数据库表,有django自己规定的数据库操作语法。

直接使用SQL非常麻烦,Django附带了一个对象关系映射器,简称ORM。应用ORM,可以在Python中编写Django模型,而不是在SQL中定义数据库表。模型定义数据库字段,这些字段对应于其数据库表中的列。

在Django中,如果没有迁移,就必须在使用的时候链接到数据库,并且输入一堆SQL命令,来更改模型定义,十分不便。

Django数据库迁移命令

以下摘自Taswy的博客:原文链接:https://blog.csdn.net/stonesola/article/details/69758612

数据库迁移的两大命令:

$ python manage.py makemigrations
$ python manage.py migrate

前者将model层转为迁移文件migration,后者将新版本的迁移文件执行,更新数据库。
这两个命令调用默认为全局,即对所有最新更改的model或迁移文件进行操作。如果想对部分app进行操作,就要在其后追加app name:

$ python manage.py makemigrations app_name
$ python manage.py migrate app_name

如果想要精确到某个迁移文件(0004_xxx.py):

$ python manage.py migrate app_name 0004

如果想看迁移文件的执行状态,可以用showmigrations命令查看:

$ python manage.py showmigrations

django迁移错误

数据库的命令稍有不慎可能就会掉坑。特别是migrate命令,由于django的数据库中包含了migrations的记录,如果migrations文件丢失,很可能造成migrate失败。

如果migrate出现了失败,很可能是因为migration文件包含的变更信息由于当前数据库的约束无法完成。这时就应该去数据中找到这些记录或键的位置,删掉重做即可。一般这些数据存在的表为:外键约束对应的表:auth_permission、django_content_type和django_migrations。

以下是笔者所写:
删除上述表的记录项可用mysql命令:

DELETE FROM table_name [WHERE Clause]

例如:删除上述表的记录项可用mysql命令:

DELETE FROM mydatabase.auth_permission WHERE id=72;

django迁移发生错误的补救

Django的数据库迁移migration操作。当你在某个app下定义了或修改了models.py,下一步是迁移,即将修改的数据库表在mysql数据库中建立表或修改表,执行:

$ python3 manage.py makemigrations

此命令在app下的migrations目录下产生一个迁移文件,如0006_customdata.py,从文件中可以看出要进行的操作。对mysql数据库进行的操作由以下命令执行:

$ python3 manage.py migrate

此命令对所有app下migrations目录下的迁移文件均将执行,例如在本工作目录下有blog,djforms两个app,则针对这两个app的migrations目录下的迁移文件执行。迁移有的会成功,也可能有的会失败。在mysql中会保留成功的迁移,失败的迁移将在终端中给出错误信息。

如果失败的迁移不影响python程序执行,可置之不理,但在运行程序时会给出讨厌的错误信息。若希望去掉错误信息,则要从migrations目录中找到出错的迁移文件,将其删除,重新修正models.py,再执行python3 manage.py makemigrations和python3 manage.py migrate。

删除迁移文件,并不会取消以前成功执行的迁移行为。

如果迁移搞乱了怎么办?假定已经在mysql中建立了表,需要保留。

删除掉migrations目录下所有的迁移文件,并使models.py中定义的数据库表与mysql数据库中的用户定义表相一致(必须要一致)。运行

$ python3 manage.py makemigrations

此命令产生一个迁移文件,再运行

$ python3 manage.py migrate

将出现以下运行结果:

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

说明所产生的迁移文件并不产生实际的迁移行为,并可消除迁移过程出现的错误提示。

需注意,不要用mysql语句删除通过models.py添加的数据库表,否则,将不能通过django的迁移重新添加同名的数据库表。

用django自带的数据库后端管理程序来管理数据库表,需将新增加数据库表填入admin.py中。例如新增表CustomData,则在admin.py中添加:

admin.site.register(models.CustomData)

你可能感兴趣的:(django,mysql)