Fork me on GitHub

Django之ORM

 

                                                                              Object Relational Mapping(ORM)                                                                                  

ORM介绍

ORM概念

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

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

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

ORM由来

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

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

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

ORM的优势

ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。 

ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。

让软件开发人员专注于业务逻辑的处理,提高了开发效率。

ORM的劣势

ORM的缺点是会在一定程度上牺牲程序的执行效率。

ORM用多了SQL语句就不会写了,关系数据库相关技能退化...

ORM总结

ORM只是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。

但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。

但是在整个软件开发过程中需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。

form表单提交数据注意事项:

1 注意form的拼写,不是from,而且在form后必须有action(URL)和method(可以使POST或者GET)

2 所有的获取用户输入的表单标签都放在form表单里面,而且表单标签必须有name标签。

3 form表单必须有submit按钮。

POST与GET的使用问题:

GET:向服务器请求一个网页的时候,

           搜索引擎检索的时候

           使用get的时候,提交的数据会跟在我们URL?后面,也就是我们get提交的数据。

POST:使用表单向服务器提交数据时。

          使用post的时候,URL中是看不到我们提交的数据的。

关于request:

request.method  得到的是你请求的方法(POST或者GET。。。)

我们在form表单中method后面可以小写我们的post或者get,但是在Django中必须大写(POST,GET)

 request.POST   得到的是POST请求发过来的全部数据(是以字典的形式发的)

我们通过这个可以拿到我们想要的所有的数据:request.POST.all(),

 

                                                                  Django中的ORM                                                                    

在Django项目的settings.py文件中,配置数据库连接信息:

在DATABASES中我们需要制定我们的数据库,

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "你的数据库名称",  # 需要自己手动创建数据库
        "USER": "数据库用户名",
        "PASSWORD": "数据库密码",
        "HOST": "数据库IP",
        "POST": 3306
    }
}

 

2. 在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:

import pymysql

pymysql.install_as_MySQLdb()

 

 

                                                               models                                                                

在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表,

基本情况:

  • 每个模型都是一个Python类,它是django.db.models.Model的子类。
  • 模型的每个属性都代表一个数据库字段。
  • 综上所述,Django为您提供了一个自动生成的数据库访问API,欲知更多查看官方文档:https://docs.djangoproject.com/en/2.0/topics/db/queries/

 

 

 创建一个APP(应用):

 我们的APP就像当于我们整个大项目的一部分:

那么我们有一种快速创建app的方式:python3 manage.py startapp app01

 创建好之后要进行的操作是要告诉Django,已经安装的app都有哪一些:

那么我们之前对数据库进行操作的时候我们一般会写一段代码:

 
        import pymysql
        conn = pymysql.connect(
            host="127.0.0.1",
            port=3306,
            user="root",
            password="123",
            database="day62",
            charset="utf8"
        )
        cursor = conn.cursor()
        cursor.execute("slect * from user;")
        ret = cursor.fetchall()

但是这样有点麻烦,因为我们每次都要写这么多的代码:

代码操作数据库的方式;
直接执行SQL
优点:执行效率高
缺点:开发效率低
按照特定的语法写,翻译成SQL语句再去执行
优点:开发效率高
缺点:执行效率低,你会忘记SQL语句

                                       在Django中ORM的使用:                              

我们一般分为四步:

第一步:告诉Django连接的数据库名:

DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME': 'day62',
                    'HOST': '127.0.0.1',
                    'PORT': 3306,
                    'USER': 'root',
                    'PASSWORD': '123',
                }
            }

 

第二步:告诉Django怎么连接,Django默认使用MYSQLdb模块连接数据库,我们要告诉Django使用pymysql模块去连接数据库:

在settings.py同目录下的__init__.py文件中,指定使用pymysql模块代替MySQLdb
                import pymysql
                pymysql.install_as_MySQLdb()

 

第三步:在app/models.py中定义我们需要的类:

 

第四步:执行创建表的操作:我们要明确一点,在Django中只能创建表,而不能创建数据库。

1. python3 manage.py makemigrations    --> 将models.py的修改登记到小本本上 。登记到小本本上是什么意思。
2. python3 manage.py migrate           --> 将修改翻译成SQL语句,去数据库执行 。 
在数据库中生成一个表,与Django对应的表。

 

在上述四步准备好之后,那么这个时候我们就可以使用我们的Django中的ORM了:

第一步:

第二步:

第三步:

第四步:

 

 


 

posted @ 2018-06-12 16:15  道阻切长  阅读(94)  评论(0编辑  收藏  举报