Django基础(六)———数据库
前言
上篇文章给大家介绍了DTL模板结构
这篇文章将讲述Django框架与MySQL数据库的综合使用
一、Django配置连接数据库
在操作数据库之前,首先先要连接数据库,这里我们以配置MySQL为例来讲解。Diango连接数据库,不需要单独的创建一个连接对象。 只需要在 settings.py 文件中做好数据库相关的配置就可以了。
二、在Django中操作数据库(原生SQL语句操作)
在Django 中操作数据库有两种方式。第一种方式就是使用原生SQL语句操作,第二种就是使用ORM模型来操作。
在Django中使用原生 SQL 语句操作其实就是使用 python db api的接口来操作。如果你的mysql驱动使用的是pymysql,那么你就是使用 pymysql来操作的,只不过Django将数据库连接的这一部分封装好了,我们只要在 settings.py中配置好了数据库连接信息后直接使用Diango封装好的接口就可以操作了。
1.安装pymysql
pip install pymysql
2.在init.py文件当中写上如下代码
import pymysqlpymysql.install_as_MySQLdb()
3.编写视图函数
#app应用下的 view.pydef index(request): #获取游标对象 cursor = connection.cursor() #拿到游标对象后执行sql语句 cursor.execute(\"select * from cangku\") #获取所有数据 rows = cursor.fetchall() #便利查询 for row in rows: print(row) return HttpResponse(\"查找成功\")
4.编写路由
#app应用下的 urls.pyfrom django.urls import pathfrom . import viewsapp_name = \'app\'urlpatterns = [ path(\'cangku\',views.index,name=\'index\')]
#database应用下的 urls.pyfrom django.contrib import adminfrom django.urls import path, includeurlpatterns = [ path(\'admin/\', admin.site.urls), path(\'app/\',include(\"app.urls\"))]
三、ORM模型介绍
1.ORM模型介绍
随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了
-
SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。
-
很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。
-
写SQL时容易忽略web安全问题,给未来造成隐患。SQL注入。
ORM,全称object Relational Mapping,中文叫做对象关系映射,通过 ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性,ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。使用ORM有许多优点:
-
易用性:使用ORM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰.
-
性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。
-
设计灵活:可以轻松的写出复杂的查询。
-
可移植性: Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL、PostgresQL和 SQLite。可以非常轻松的切换数据库。
2.创建ORM模型
ORM模型一般都是放在 app的 models.py文件中。每个app都可以拥有自己的模型。并且如果这个模型想要映射到数据库中,那么这个 app必须要放在settings.py的INSTALLED_APP 中进行安装。以下是写一个简单的仓库ORM 模型。
#app应用中 models.py文件from django.db import models#电子产品class Dianzichanpin(models.Model): objects = None name = models.CharField(max_length=100) factory =models.CharField(max_length=100) pub_time = models.DateTimeField(auto_now_add=True) price = models.FloatField(default=0)
3.映射模型到数据库中
将 ORM 模型映射到数据库中,总结起来就是以下几步:
-
在settings.py中,配置好 DATABASES,做好数据库相关的配置,
-
在 app 中的 mode1s.py中定义好模型,这个模型必须继承自 django.db.models。
-
将这个app添加到settings.py的INSTALLED_APP中。
-
在命令行终端,进入到项目所在的路径,然后执行命令 python manage.py makemigrations 来生成迁移脚本文件。
-
同样在命令行中,执行命令 python manage.py migrate 来将迁移脚本文件映射到数据库中。
四、CRUD操作
在 ORM框架中,所有模型相关的操作,比如添加/删除等。其实都是映射到数据库中一条数据的操作。因此模型操作也就是数据库表中数据的操作。
1.添加一个模型到数据库当中
编写视图函数
#app应用下 views.pydef add(request): Dianzi =Dianzichanpin(name=\'手机\',factory=\'福建\',price=1200) Dianzi.save() return HttpResponse(\"图书插入成功\")
编写路由
#app应用下的 urls.py path(\'add\',views.add,name=\'add\')
2.查找数据
查找数据都是通过模型下的 objects 对象来实现的。
2.1查找所有数据
要查找 Dianzichanpin 这个模型对应的表下的所有数据。
编写视图函数
#app应用下 views.pydef query(request): Dianzi = Dianzichanpin.objects.all() for Dian in Dianzi: print(Dian.id,Dian.name,Dian.pub_time,Dian.price) return HttpResponse(\"查找成功\")
编写路由
#app应用下的 urls.py path(\'query\',views.query,name=\'query\')
2.2数据过滤
在查找数据的时候,有时候需要对一些数据进行过滤。那么这时候需要调用objects的 filter 方法。
编写视图函数
def query(request): # Dianzi = Dianzichanpin.objects.all() Dianzi = Dianzichanpin.objects.filter(name=\'手机\') for Dian in Dianzi: print(Dian.id,Dian.name,Dian.pub_time,Dian.price) return HttpResponse(\"查找成功\")
2.3获取单个对象(多用于登陆注册)
使用 filter返回的是所有满足条件的结果集。有时候如果只需要返回第一个满足条件的对象。那么可以使用 get方法。
编写视图函数
def query(request): Dianzi = Dianzichanpin.objects.get(name=\'手机\') print(Dianzi.name) return HttpResponse(\"查找成功\")
2.4数据排序
在之前的例子中,数据都是无序的。如果你想在査找数据的时候使用某个字段来进行排序,那么可以使用order_by方法来实现。
编写视图函数
def query(request): Dianzi = Dianzichanpin.objects.order_by(\"pub_time\") for Dian in Dianzi: print(Dian.name) return HttpResponse(\"查找成功\")
默认为从小到大排列,如果想要倒叙,在对应数据前面放上-号
3.修改数据
在查找到数据后,便可以进行修改了。修改的方式非常简单,只需要将查找出来的对象的某个属性进行修改,然后再调用这个对象的 save 方法便可以进行修改。
编写视图函数
def update(reuqest): Dianzi = Dianzichanpin.objects.first() Dianzi.name =\'耳机\' Dianzi.save() return HttpResponse(\'修改成功\')
编写路由
#app应用下的 urls.pypath(\'update\',views.update,name=\'update\')
4.删除数据
在查找到数据后,便可以进行删除了。删除数据非常简单,只需要调用这个对象的 delete方法即可
编写视图函数
def delete_(request): Dianzi = Dianzichanpin.objects.get(name=\'电子手表\') Dianzi.delete() return HttpResponse(\'删除成功\')
编写路由
path(\'delete\',views.delete_,name=\'delete\')