ORM模型介绍
随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了:
- SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。
- 很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。
- 写SQL时容易忽略web安全问题,给未来造成隐患。SQL注入。
ORM
,全称Object Relational Mapping
,中文叫做对象关系映射,通过ORM
我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性,ORM
在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
创建ORM模型:
一、新建一个名为“orm_intro”的数据库
二、改变setting.py的DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'orm_intro',
'USER':'root',
'PASSWORD':'root',
'HOST':'127.0.0.1',
'PORT':'3306'
}
}
三、创建一个app
查看发现有一个models.py,所有和book有关的模型,都放在models.py中
四、实现orm模型
from django.db import models
# Create your models here.
# 如果要将一个普通的类变成一个可以映射到数据库中的ORM模型
# 那么必须要将父类设置为models.Model或者其他的子类
class Book(models.Model):
# 1.id:int类型,是自增长的,主键
id = models.AutoField(primary_key=True)
# 2.name:varchar(100),图书的名字,不能为空
name = models.CharField(max_length=100,null=False)
# 3.author:varchar(100),图书的作者
author = models.CharField(max_length=100,null=False)
# 4.price:float,图书的价格
price = models.FloatField(null=False,default=0)
五、映射模型到数据库中
将这个app
添加到settings.py
的INSTALLED_APP
中。
在命令行终端,进入到项目所在的路径,然后执行命令python manage.py makemigrations
来生成迁移脚本文件。
同样在命令行中,执行命令python manage.py migrate
来将迁移脚本文件映射到数据库中。
ORM模型的增删改查操作
这时查看数据库:
我们先在views.py定义一个index
def index(request):
pass
再去urls.py中做映射
from django.urls import path
from book import views
urlpatterns = [
path('', views.index),
]
添加数据
from .models import Book
from django.http import HttpResponse
# Create your views here.
def index(request):
# 1.使用ORM添加一条数据到数据库中
#book = Book(name='三国演义',author='罗贯中',price=200)
book = Book(name='西游记',author='吴承恩',price=100)
book.save()
return HttpResponse('图书添加成功!')
查询数据
# 2.查询
# 2.1根据主键进行查找
# primary key
book = Book.objects.get(pk=1)
print(book)
return HttpResponse('图书添加成功!')
返回的是个object对象,需要在models里面定义一个返回格式函数
def __str__(self):
# <Book:(name,author,price)>
return "<Book:({name},{author},{price})>".format(name=self.name,author=self.author,price=self.price)
# 2.2根据其他条件进行查找
books = Book.objects.filter(name='西游记')
print(books)
删除数据
# 3.删除数据
book = Book.objects.get(pk=1)
book.delete()
return HttpResponse('图书添加成功!')
修改数据
# 4.修改数据
book = Book.objects.get(pk=2)
book.price = 300
book.save()