当前位置 博文首页 > 文章内容

    Django基础之:ORM系统:单表操作

    作者: 栏目:未分类 时间:2020-08-29 16:01:13

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    一、ORM 简介

    1.1. web开发的分工模式

    1. DBA(数据库管理员)+应用层开发。

      一般中大型公司(或者数据量巨大、读取数据的需求频繁并且追求极致效率的公司)会有专门的DBA管理数据库,编写sql语句,对于应用层开发来说,不用写sql语句,直接调用他写的接口就行。所以在这种公司一般来说,开发人员应该'供'着DBA,因为你想写入或者取出的数据需要依赖于DBA去执行,或者是你写的比较复杂的sql语句需要让DBA帮你看一下,效率行不行、是不是需要优化等等,这就需要看你们的交情或者其心情了。哈哈(开个玩笑)。

    2. 应用程序开发+sql语句编写。

      这种情况多存在于小公司,没有专门设置DBA岗位,要求开发人员什么都会一些,linux、数据库、前端等等,这样成本降低并且减少由于部门之间的沟通带来的损失,提高工作流程效率。

    3. 应用程序开发+ORM。

      这种模式sql不用你写,你直接写类、对象,应为你对这些更加游刃有余。然后通过你写的类、对象,等等通过相应的转换关系直接转化成对应的原生sql语句,这种转化关系就是ORM:对象-关系-映射。你直接写一个类就是创建一张表,你实例化一个对象就是增加一条数据,这样以来,既可以避开写sql语句的麻烦,而且可以提升我们的开发效率。

    1.2 ORM 概念

      对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

      简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

      ORM在业务逻辑层和数据库层之间充当了桥梁的作用。

    1.3 ORM由来

      让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。

      几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。

      按照之前的方式来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。

    ORM优势

    1. 提高开发效率。
    2. 不同数据库可以平滑切换。
    3. 让软件开发人员专注于业务逻辑的处理,提高了开发效率。

    ORM劣势

    1. ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
    2. 长期写 ORM 代码,会降低编写 SQL 语句的能力。

    ORM 解析过程

    1. ORM 会将 Python 代码转成为 SQL 语句。
    2. SQL 语句通过 pymysql 传送到数据库服务端。
    3. 在数据库中执行 SQL 语句并将结果返回。

    ORM对应关系表

     

     

    二、数据库配置

    2.1 Django 如何使用 mysql 数据库

      创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:

    create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

      例如常见 runoob 数据库,编码指定为 utf8:

    create database runoob default charset=utf8;   

      我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

    DATABASES = { 
        'default': 
        { 
            'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
            'NAME': 'runoob', # 数据库名称
            'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 
            'PORT': 3306, # 端口 
            'USER': 'root',  # 数据库用户名
            'PASSWORD': '123456', # 数据库密码
        }  
    }

      上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来。

      上面是给项目中的所有的应用都配置成MySQL数据库,当然我们也可以给单个应用配置数据库:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'ormtest',           # 要连接的数据库,连接前需要创建好
            'USER':'root',        # 连接数据库的用户名
            'PASSWORD':'',        # 连接数据库的密码
            'HOST':'127.0.0.1',       # 连接主机,默认本级
            'PORT':3306            #  端口 默认3306
        },
        'app01': { #可以为每个app都配置自己的数据,并且数据库还可以指定别的,也就是不一定就是mysql,也可以指定sqlite等其他的数据库
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'ormtest',           # 要连接的数据库,连接前需要创建好
            'USER':'root',        # 连接数据库的用户名
            'PASSWORD':'',        # 连接数据库的密码
            'HOST':'127.0.0.1',       # 连接主机,默认本级
            'PORT':3306            #  端口 默认3306
        }
    }
    
    app配置单独的数据库

      接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:

    # 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
    import pymysql
    pymysql.install_as_MySQLdb()

    三、定义模型

    3.1 创建 APP

      Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 TestModel 的 app:

    django-admin.py startapp TestModel

    结构目录如下

    HelloWorld
    |-- HelloWorld
    |-- manage.py
    ...
    |-- TestModel
    |   |-- __init__.py
    |   |-- admin.py
    |   |-- models.py
    |   |-- tests.py
    |   `-- views.py

      我们修改 TestModel/models.py 文件,代码如下:

    # models.py
    from django.db import models
     
    class Test(models.Model):
        name = models.CharField(max_length=20)

      以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

      接下来在 settings.py 中找到INSTALLED_APPS这一项,如下:

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'TestModel',               # 添加此项
    )

      在命令行中运行:

    $ python3 manage.py migrate   # 创建表结构
    
    $ python3 manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
    $ python3 manage.py migrate TestModel   # 创建表结构

      看到几行 "Creating table…" 的字样,你的数据表就创建好了。

    Creating tables ...
    ……
    Creating table TestModel_test  #我们自定义的表
    ……

      表名组成结构为:应用名_类名(如:TestModel_test)。

      注意:尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。