[python][django学习篇][4]django完成数据库代码翻译:迁移数据库(migration)

上一篇我们已经完成数据库的设计,但是仅仅是python语言,并没有真正创建了数据库表。翻译成数据库语言,真正创建数据库表由django manage.py来实现,这一过程专业术语:迁移数据库

  1. 切换到manage.py所在目录,分别执行命令:python manage.py makemigrations , python manage.py migrate

    •  执行python manage.py makemigrations结果

      •   

        F:\pythoncode\django\workspace\blogproject
        (djanoproject_env) λ python manage.py makemigrations
        Migrations for ‘blog‘:
          blog\migrations\0001_initial.py:
            - Create model Category
            - Create model Post
            - Create model Tag
            - Add field tags to post
    • 执行python manage.py migrate
      •  

        F:\pythoncode\django\workspace\blogproject
        (djanoproject_env) λ python manage.py migrate
        Operations to perform:
          Apply all migrations: admin, auth, blog, contenttypes, sessions
        Running migrations:
          Applying contenttypes.0001_initial... OK
          Applying auth.0001_initial... OK
          Applying admin.0001_initial... OK
          Applying admin.0002_logentry_remove_auto_add... 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 auth.0007_alter_validators_add_error_messages... OK
          Applying auth.0008_alter_user_username_max_length... OK
          Applying blog.0001_initial... OK
          Applying sessions.0001_initial... OK
        
        F:\pythoncode\django\workspace\blogproject
        (djanoproject_env) λ
  2. 命令解析
    • python manage.py makemigrations

      • 类似于linux的创建文件夹migrations,不同地方在于:这里还创建一个文件:0001_initial.py。换言之,执行python manage.py makemigrations 创建文件: F:\pythoncode\django\workspace\blogproject\blog\migrations\0001_initial.py
      • 0001_initial.py作用: Django 用来记录我们对模型做了哪些修改的文件。目前来说,我们在 models.py 文件里创建了 3 个模型类,Django 把这些变化记录在了 0001_initial.py 里。
    • python manage.py migrate :
      • 不过此时还只是告诉了 Django 我们做了哪些改变,为了让 Django 真正地为我们创建数据库表,接下来又执行了 python manage.py migrate 命令。Django 通过检测应用中 migrations\ 目录下的文件,得知我们对数据库做了哪些操作,然后它把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库。
      • 可以看到命令的输出除了 Applying blog.0001_initial... OK 外,Django 还对其它文件做了操作。这是因为除了我们自己建立的 blog 应用外,Django 自身还内置了很多应用,这些应用本身也是需要存储数据的。可以在 settings.py 的INSTALLED_APP 设置里看到这些应用,当然我们目前不必关心这些。
      • blogproject/settings.py
        
        INSTALLED_APPS = [
            ‘django.contrib.admin‘,
            ‘django.contrib.auth‘,
            ‘django.contrib.contenttypes‘,
            ‘django.contrib.sessions‘,
            ‘django.contrib.messages‘,
            ‘django.contrib.staticfiles‘,
            ‘blog‘,
  3. 查看真正创建数据库的语句:
    • 对于了解数据库语言的人,你可以运行下面的命令看看 Django 究竟为我们做了什么:

      python manage.py sqlmigrate blog 0001
      

      你将看到输出了经 Django 翻译后的数据库表创建语句,这有助于你理解 Django ORM 的工作机制。

    • F:\pythoncode\django\workspace\blogproject
      (djanoproject_env) λ python manage.py sqlmigrate blog 0001
      BEGIN;
      --
      -- Create model Category
      --
      CREATE TABLE "blog_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NO
      T NULL);
      --
      -- Create model Post
      --
      CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(70) NOT NU
      LL, "body" text NOT NULL, "create_time" datetime NOT NULL, "modified_time" date NOT NULL, "excerpt" v
      archar(200) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id"), "category_id" integ
      er NOT NULL REFERENCES "blog_category" ("id"));
      --
      -- Create model Tag
      --
      CREATE TABLE "blog_tag" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(70) NOT NULL
      );
      --
      -- Add field tags to post
      --
      CREATE TABLE "blog_post_tags" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "post_id" integer NOT
       NULL REFERENCES "blog_post" ("id"), "tag_id" integer NOT NULL REFERENCES "blog_tag" ("id"));
      CREATE INDEX "blog_post_4f331e2f" ON "blog_post" ("author_id");
      CREATE INDEX "blog_post_b583a629" ON "blog_post" ("category_id");
      CREATE UNIQUE INDEX "blog_post_tags_post_id_4925ec37_uniq" ON "blog_post_tags" ("post_id", "tag_id");
      
      CREATE INDEX "blog_post_tags_f3aa1999" ON "blog_post_tags" ("post_id");
      CREATE INDEX "blog_post_tags_76f094bc" ON "blog_post_tags" ("tag_id");
      COMMIT;
      
      F:\pythoncode\django\workspace\blogproject

时间: 2024-10-30 17:47:12

[python][django学习篇][4]django完成数据库代码翻译:迁移数据库(migration)的相关文章

Django学习笔记 官网教程纠正 代码

原文: Django学习笔记 官网教程纠正 代码 Django学习笔记 4.模板初学中,照书例django book 出现以下异常 raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE) ImportError: Settings cannot be imported, because environmen

Django学习篇(web框架的由来)

Python的WEB框架有 Django.Tornado.Flask 等多种 ,Django相较与其他WEB框架其优势为: 大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本模式:M    V     C (对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端.) #!/usr/bin/env python #coding:utf-8 import socket def handle_request(clie

Django学习1---安装Django,创建、启动项目

最近在自己独立开发一套运维管理系统,在一些python的web框架中选择了Django进行开发,在这里把开发过程中的一些操作记录下来,供自己回顾,也供初学django的朋友们参考! 本例是基于python3.6版本,Django1.11.7版本. 安装Django: # pip install Django # python3.6 >>> import django >>> 能够正常导入django模块,说明安装成功. 创建项目: # django-admin.py s

Django 框架篇: 一. Django介绍; 二. 安装; 三. 创建项目;

一. web框架:   框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\

Django 框架篇(九): Django中的Form 组件

Django中的Form组件,帮我们处理了 form表单中的校验, 和错误提示的处理: 主要功能: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 使用form组件实现注册功能 1.  定义一个类, 继承django中的 forms.Form 代码实例: from django import forms # 按照Django form组件的要求自己写一个类 class RegForm(forms.Form): name = forms.CharField(label="用

linux 下一个 jira-6.3.6 组态 皴 翻译 迁移数据库

每一个版本号翻译包下载  https://translations.atlassian.com/dashboard/download jira下载地址  https://www.atlassian.com/zh/software/jira/download 这里使用的是最新版本号jira-6.3.6 实验环境 操作系统 Red Hat Enterprise Linux Server release 5.9 (64) 数据库 mysql : Ver 14.14 Distrib 5.6.12, fo

linux 下 jira-6.3.6 配置 破解 翻译 迁移数据库

各个版本翻译包下载地址  https://translations.atlassian.com/dashboard/download jira下载地址  https://www.atlassian.com/zh/software/jira/download 这里使用的是最新版本jira-6.3.6 实验环境 操作系统 Red Hat Enterprise Linux Server release 5.9 (64) 数据库 mysql : Ver 14.14 Distrib 5.6.12, for

[python][django学习篇][6]操作数据库

查询(取)数据 >>> Category.objects.all() <QuerySet [<Category: Category object>]> >>> Tag.objects.all() <QuerySet [<Tag: Tag object>]> >>> Post.objects.all() <QuerySet [<Post: Post object>]> >>

[python][django学习篇]后台admin用户编写博客文章

1 如果没有创建超级管理员账号,先要创建python manage.py createsuperuser 2 在admin后台注册模型 from django.contrib import admin from .models import Post, Category, Tag admin.site.register(Post) admin.site.register(Category) admin.site.register(Tag) 3 超级用户登录admin 后台 激活虚拟环境,运行开发