zoukankan      html  css  js  c++  java
  • [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:pythoncodedjangoworkspacelogproject
          (djanoproject_env) λ python manage.py makemigrations
          Migrations for 'blog':
            blogmigrations001_initial.py:
              - Create model Category
              - Create model Post
              - Create model Tag
              - Add field tags to post
      • 执行python manage.py migrate
        •  
          F:pythoncodedjangoworkspacelogproject
          (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:pythoncodedjangoworkspacelogproject
          (djanoproject_env) λ


           

    2. 命令解析
      • python manage.py makemigrations
        • 类似于linux的创建文件夹migrations,不同地方在于:这里还创建一个文件:0001_initial.py。换言之,执行python manage.py makemigrations 创建文件: F:pythoncodedjangoworkspacelogprojectlogmigrations001_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:pythoncodedjangoworkspacelogproject
        (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:pythoncodedjangoworkspacelogproject
        View Code
  • 相关阅读:
    我对Web开发相关技术的认识过程
    JavaScript、JSP和Java之间的关系
    中断处理中的save_all、restore_all和iret
    实验五:Linux操作系统是如何工作的?破解操作系统的奥秘
    java CPU的乱序执行
    java缓存行对齐(缓存行二)
    解决ojdbc6升级ojdbc8中文乱码问题
    Caused by: java.lang.ClassNotFoundException: com.alibaba.dubbo.common.Version
    springSecurity5 重定向登录页面后 报错:尝试清除 Cookie.net::ERR_TOO_MANY_REDIRECTS status:200
    java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
  • 原文地址:https://www.cnblogs.com/liuzhipenglove/p/7338549.html
Copyright © 2011-2022 走看看