`

django 1.7 manage.py 详解

阅读更多

      django 自从 1.7 之后解决了很多问题,并且对于数据库的操作带来了几个新命令用以解决数据迁移问题,今天开始看看文档学习一下。部分内容来源于网络


Django 自 1.7 之后增加了类似 South 的 migration 功能,修改 Model 后可以在不影响现有数据的前提下重建表结构。这真是个千呼万唤始出来的 feature 了

一、migration 介绍

Migrations 其实就是一堆帮助你完成数据库变更和数据迁移的命令,使得你可以用 “Django” 的方式来管理和变更数据库的 schema。

1.1 特性

Migrations让事情变得简单可控:

  • 它使得数据库 schema 的调整可以通过Django命令来完成
  • 它使得数据库的 schema 和对应的 model 的变更被 track 起来:整个历史都可以版本化在 Git 里面
  • 提供了一套匹配 schema 和对应的 fixture 的机制
  • 如何和 CI 搭配起来,可以保证代码和数据一致性

1.2 创建 migrations

当有新的 models 创建或者变更的情况下,需要创建一个 migration

1
# python manage.py makemigrations <appname>

Migrations for 'fault_reports':
  0001_initial.py:
    - Create model FaultReports
    - Create model Log
    - Create model User
  • 执行完并生成个文件:<appname>/migrations/0001_initial.py
  • 文件是一个夹杂着 mysql 语句的 python 文件,可以手动修改

查看建表语句

1
python manage.py sqlmigrate <appname> 0001

 

这里有个注意的问题是那个 0001,其实是 app_lable,默认创建的时候为 0001,可以在 migrations 的目录下看到文件的前缀,其实就是 app_lable

检查所有的配置是否OK

1
python manage.py check

 

1.3 应用 migrations

创建对数据库修改及新建。只对新增的内容操作,这样以后有改动就不用删除数据库或表了

1
# python manage.py migrate

(django182-py2710)➜ ops git:(develop) ✗ ./manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, fault_reports, contenttypes, 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 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 fault_reports.0001_initial... OK
  Applying sessions.0001_initial... OK

如果是全新的 app,这两步已经结束了,不需要 syncdb 操作了。总结一下。流程如下

  • 1、建立或者更新一个 model
  • 2、运行 python manage.py makemigrations <app_name>
  • 3、运行 python mange.py migrate <app_name> 来应用创建的 Migrations
  • 4、重复前面的步骤

1.4 已有项目进行 migration

日后项目的过程中可能会修改 models 结构,那么就需要如下操作

  • 1、运行 ./manage.py makemigrations <appname>,Django 会根据你当前 model 来创建那份 initial migrations file。
  • 2、运行 ./manage.py migrate,Django 会把已经存在的数据库 table 当成是 makemigration 的产物,完成整个 migration

如果运行报错了,那么就需要做一个并不是真 migration 的 fake 了。

1
./manage.py migrate --fake <appname>

	- Mark migrations as run without actually running them

 

1.5 更多细节

如果你再次运行 python manage.py migrate,会发现什么都没有发生:这是因为在项目的数据库中有一张 django_migrations 仍然被更新。表,记录了哪些 Migrations 已经被应用过了:无论是运行了 migrate 还是 fake 的,这个表都会被插入一条记录。比如从 South 升级到使用 Django 自带的MigrationsDjango 会检查是否有更新。如果没有,它就 fake 一次,但 django_migrations 仍然被更新。

在少数情况下,确实有需要再次运行某个特定的 Migrations,我们可以在 django_migrations 里面把这个记录删除掉。

在极少数情况下,如果你有需要回退到特定的版本,比如最初的 zero 版本,可以用类似

1
python manage.py migrate <app_name> zero

 

  

参考阅读

 
 
分享到:
评论

相关推荐

    django 解决manage.py migrate无效的问题

    已有的model,修改之后,想重新建模,于是将migrations文件夹中除__init__.py之外其他文件都删掉,再次执行以下步骤python manage.py makemigrations确认成功,执行python manage.py migrate,提示No migrations to ...

    Django-manage.py-anywhere:从任何地方运行manage.py命令。 查找最接近当前路径的manage.py文件并对其执行命令

    Django-manage.py-任何地方 从Django项目的任何目录运行manage.py命令。 注意:此工具不需要任何进一步的更新,因此如果您发现它最近没有任何更新,请不要担心。 它不需要任何东西。 它仅适用于任何Django版本。 ...

    Django-1.2.5.tar.gz

    - 创建应用:`cd myproject && python manage.py startapp myapp` - 配置数据库:修改myproject/settings.py中的DATABASES设置 - 运行服务器:`python manage.py runserver` 5. Django核心概念: - Model:模型是...

    django manage.py扩展自定义命令方法

    # django manage.py扩展自定义命令 环境: mac django1.10.3 在实际的项目开发过程中,我们可能要执行某脚本初始化数据库,可能要启动多个服务,比如启动celery,redis等。要是直接执行python mange.py celery/...

    Django-1.11.29-py2.py3-none-any.whl

    Django-1.11-py2.py3-none-any.whl,django开发,适用于python3.5 3.6 3.7

    django-pdb, 提供 `manage.py runserver pdb` 和 `manage.py test pdb`.zip

    django-pdb, 提供 `manage.py runserver pdb` 和 `manage.py test pdb` Django PDB 使调试 Django 容易每次想闯入pdb时都将 pdb.set_trace() 添加到源文件中。这样 不行. 这样做。安装使用pip安装:pip install ...

    Django-1.7.10.tar.gz

    然后,你可以创建一个新的Django项目和应用,使用`django-admin startproject`和`python manage.py startapp`命令。接着,就可以根据需求编写视图、模板和模型,构建你的Web应用程序了。 总的来说,Django 1.7.10...

    基于django的python自动化测试后台源码+全部数据.zip

    python manage.py migrate 初次执行时为了先把默认Django需要的数据库创建出来,创建数据库迁移文件 python manage.py makemigrations 启动Django python manage.py runserver 0.0.0.0:8081 TestPlatformDjango 先...

    Django-3.0.3.tar.gz

    关于Python安装官方whl包和tar.gz包的方法详解 Django-3.0.3.tar.gz 安装包 解压后按下面方法安装 Windows环境:  安装whl包:pip install wheel -&gt; pip install **.whl  安装tar.gz包:cd到解压后路径,...

    django_plus:manage.py 的一个简单模块

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

    笔记_DJango1.7.pdf

    笔记_DJango1.7

    Django学习笔记.docx

    * manage.py:命令行工具,用于交互式管理 Django 项目 * __init__.py:空文件,用于标识目录为包 * settings.py:项目配置文件,主要处理文件 * urls.py:项目 URL 声明,主要处理文件 * wsgi.py:项目与 WSGI 兼容...

    django执行命令 python manage.py startapp xxx报错os not defined问题(.pdf

    'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], ... }, ] ``` 这里的 `os.path.join()` 函数用于构建模板目录的完整路径,它需要先导入 `os`...

    Python-网站开发之Django环境搭建.doc

    ImportError: No module named django.core ``` - **解决方法**:使用完整的路径来执行 `django-admin.py`,例如: ```shell python D:\python\ENV\Scripts\django-admin.py startproject mysite ``` 其中 ...

    python大作业基于django+APScheduler的定时任务管理系统源码.zip

    环境搭建完成后,使用python3 manage.py makemigrations以及python3 manage.py migrate指令完成数据库初始化。如出现报错,可先将admin.py中最后一行的clear_job()注释掉,待数据库构建完成后再解除注释即可。 使用...

    Django-beyking.pdf

    `manage.py`几乎与`django-admin.py`相同,但额外检查当前目录下是否已有`settings.py`文件;而`settings.py`则继承自`django/conf/global_settings.py`,包含了Django认为需要用户自定义的设置项。 ### 工作原理 ...

    如何解决python.exe: can’t open file ‘manage.py’: [Errno 2] No such file or directory这个问题

    如何解决python.exe: can’t open file ‘manage.py’: [Errno 2] No such file or directory这个问题 #本文章是记录我在开发一个基于python django的项目中的一些问题。本人新手小白,请多包涵。 使用pycharm新建一...

    Django-1.1.4.tar.gz

    from django.http import HttpResponse from myapp.models import MyModel def my_view(request): data = MyModel.objects.all() return HttpResponse("Hello, World!") ``` 然后,编写模板文件(例如:myapp/...

    django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决

    一、现象 最近在数据库中删除了一张表,重新执行python manage.py ...解决办法仍然是执行python manage.py makemigrations和python manage.py migrate,只不过在执行这个之前,把第一次执行迁移创建表的那个记录删

Global site tag (gtag.js) - Google Analytics