ORM

ORM

一、Django模型层之ORM介绍

ORM是什么?为何要有ORM?

我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(增、删、改、查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。

如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要在应用程序中编写原生sql语句,然后使用pymysql模块远程操作mysql数据

针对应用程序的数据操作,直接编写原生sql语句会存在两方面的问题,严重影响开发效率,如下

#1. sql语句的执行效率问题:应用开发程序员需要耗费一大部分精力去优化sql语句
#2. 数据库迁移问题:针对mysql开发的sql语句无法直接应用到oracle数据库上,一旦需要迁移数据库,便需要考虑跨平台问题

为了解决上述问题,django引入了ORM的概念,ORM全称Object Relational Mapping,即对象关系映射,是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行

基于图2所示,有了ORM框架,开发人员既不用再去考虑原生SQL的优化问题,也不用考虑数据库迁移的问题,ORM都帮我们做了优化且支持多种数据库,这极大地提升了我们的开发效率,下面就让我们来详细学习ORM的使用吧

二、ORM的使用之模型

在django的ORM框架中,继承自django.db.models.Model的类称之为模型类,或简称模型。

一个模型是关于你的数据,唯一的、决定性的信息源、它包含存储数据的基本字段和方法。

通常,每个模型都映射到一个数据库表。模型中的属性对应数据库表的字段

如下所示:原生SQL与ORM的模型对应关系

三、ORM的使用之数据库迁移

1、创建模型

数据来源于数据库的表,而ORM的模型类对应数据库表,所以若我们想操作数据,必须先创建模型。

# 创建django项目,新建名为app01的app,在app01的models.py中创建模型
class Employee(models.Model):  # 必须是models.Model的子类
    id=models.AutoField(primary_key=True)

    name=models.CharField(max_length=16)

    gender=models.BooleanField(default=1)

    birth=models.DateField()

    department=models.CharField(max_length=30)

    salary=models.DecimalField(max_digits=10,decimal_places=1)

2、 配置settings.py

1.注册应用

但凡涉及到数据库同步操作的应用,都需要事先在settings.py的INSTALLED_APPS中完成注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # django2.x+版本
    'app01.apps.App01Config', # 如果默认已经添加了,则无需重复添加
    # 'app02.apps.App02Config', # 若有新增的app,按照规律依次添加即可

    # django1.x版本
    'app01',  # 直接写应用名字
    # 'app02'
]

2.配置后端数据库

django的orm支持多种数据库(如PostgreSQL、MySQL、SQLite、Oracle等),如果想将上述模型转为mysql数据库中的表,需要settings.py中配置DATABASES,如下

# 删除\注释掉原来的DATABASES配置项,新增下述配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 使用mysql数据库
        'NAME': 'db1',          # 要连接的数据库
        'USER': 'root',         # 链接数据库的用于名
        'PASSWORD': '',         # 链接数据库的用于名                  
        'HOST': '127.0.0.1',    # mysql服务监听的ip  
        'PORT': 3306,           # mysql服务监听的端口  
        'ATOMIC_REQUEST': True, #设置为True代表同一个http请求所对应的所有sql都放在一个事务中执行 
                                #(要么所有都成功,要么所有都失败),这是全局性的配置,如果要对某个
                                #http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 
        "AUTOCOMMIT":False, #全局取消自动提交,慎用
        'OPTIONS': {
            "init_command": "SET storage_engine=INNODB", #设置创建表的存储引擎为INNODB
            'isolation_level': "read committed",  # 默认为RC,可以设置成其他级别(详见下面解释)
        }
    }
}

"""
=================================》额外补充:
当运行并发负载时,来自不同会话的数据库事务(例如,处理不同请求的单独线程)可能会相互交互。 这些交互受每个会话的事务隔离级别的影响。 您可以在DATABASES中的数据库配置的OPTIONS部分中使用'isolation_level'条目设置连接的隔离级别。 此条目的有效值是四个标准隔离级别:

'read uncommitted'
'read committed'
'repeatable read'
'serializable'
或None来使用服务器配置的隔离级别。 
然而,Django最好使用read committed而不是MySQL的默认值repeatable read。 repeatable read可能导致数据丢失。
"""

强调!!!:在链接mysql数据库前,必须事先创建好数据库

mysql> create database db1; # 数据库名必须与settings.py中指定的名字对应上

3.配置日志

如果想打印orm转换过程中的sql,需要在settings中进行配置日志:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

首先执行下述命令来创建一个迁移

3、mysqlclient安装与兼容性问题

$ python manage.py makemigrations

会抛出异常

......
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

提示我们需要事先安装好mysqlclient,并且默认加载的mysqlclient是模块MySQLdb,需要安装MySQL-python,但目前python官方第三库中最新版MySQLdb 1.2.5对python解释器以及MySQL Server的支持如下,并不支持python3.0+

• 对Python解释器的支持

CPython : 支持2.4到2.7

PyPy(用python实现的python解释器) : 支持到最新版本

• 对MySQL Server的支持

– 3.23=< MySQL <= 5.5

为此,有人在github中创建了一个MySQLdb1分支 来支持Cpython3.0+解释器,可以参照官网进行安装https://pypi.org/project/mysqlclient/

除了使用MySQLdb作为MySQLclient之外,我们还有可以使用pymysql

• Python解释器支持:

CPython : 2.7 and >= 3.5

PyPy : Latest version

• MySQL Server支持:

MySQL >= 5.5

MariaDB >= 5.5

比起前者,pymysql直接支持Cpython3.0+,安装简单

pip3 install pymysql

但是因为Django默认加载的MySQLclient是MySQLdb,所以需要作出修改

此时重新执行python manage.py makemigrations仍会抛出异常

......    
    File "/Users/linhaifeng/PycharmProjects/egon_test/venv-3.8/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 37, in <module>
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

需要根据上述异常提示的文件base.py路径打开文件,注释下述两行

111

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇

You cannot copy content of this page