ORM简介
对象关系映射(Object Relational Mapping,简称ORM)。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
-
ORM的优点:
- -不用写繁琐的SQL语句,用咱们熟悉的python代码,就能实现对数据的操作,提高开发效率;
- -可以平滑的操作,切换数据库。 ORM的缺点:
- -ORM代码转换为SQL语句时,需要花费一定的时间,执行效率会有所降低;
- -长期写ORM代码,导致写SQL语句能力,会有所减弱。
django使用mysq
-
手动创建数据库
注意:ORM无法操作到数据库级别,只能操作到数据表。create database 数据库名称 default charset=utf8;
-
在settings里配置数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 更改为mysql引擎 'NAME': "day49", # 数据库名称 "HOST": "127.0.0.1", # 数据库所在ip地址 'PORT': 3306, # 默认的端口 'USER': 'root', # 用户名 'PASSWORD': "123", # 密码 } }
-
在
settings.py
的同级目录下的__init__.py
设置
使用pymysql模块连接mysql数据库import pymysql pymysql.install_as_MySQLdb()
-
在app下的
models.py
里写上模型类(单表)class Book(models.Model): # id会自动创建,并且是一个主键 title = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) # 最大值,只能是999.99 publish = models.CharField(max_length=64) pub_date = models.DateField()
字段 | 含义 |
---|---|
CharField | 字符串字段,要求必须有一个参数 maxlength |
IntegerField | 用于保存一个整数 |
FloatField | 一个浮点数. 必须 提供两个参数:max_digits 总位数 decimal_places 小数位数 |
AutoField | 一个 IntegerField, 添加记录时它会自动增长. |
BooleanField | A true/false field. |
TextField | 一个容量很大的文本字段. |
EmailField | 一个带有检查Email合法性的 CharField |
DateField | 一个日期字段. 共有下列额外的可选参数:Argument auto_now auto_now_add |
DateTimeField | 一个日期时间字段. 类似 DateField 支持同样的附加选项. |
ImageField | 类似 FileField 它有两个可选参数:height_field和width_field, |
FileField | 一个文件上传字段.参数: upload_to |
URLField | 用于保存 URL. |
NullBooleanField | 类似 BooleanField, 不过允许 NULL 作为其中一个选项. |
SlugField | slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符 |
… | … |
参数 | 含义 |
---|---|
null | 如果为True,Django 将用NULL 来在数据库中存储空值。默认值是 False. |
blank | 如果为True,该字段允许不填。默认为False。(要注意,这与 null 不同) |
default | 字段的默认值。可以是一个值或者可调用对象。 |
primary_key | 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True, |
unique | 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 |
choices | 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 |
-
在命令行执行数据迁移的命令
python3 manage.py makemigrations # 把models.py的变更记录记录下来 python3 manage.py migrate # 把变更记录的操作同步到数据库中
当执行第一条命令时,报错的解决办法:
-
sudo vim /home/moluo/.local/lib/python3.6/site-packages/django/db/backends/mysql/base.py 快速定位到行 :行数 + 回车 注释掉35和36 按一下Esc :wq + 回车
-
sudo vim /home/moluo/.local/lib/python3.6/site-packages/django/db/backends/mysql/operations.py 在146行,加上如下代码 query = query.encode() 按一下Esc :wq + 回车
-
单表数据的增删改查
在views.py
中
添加表记录
- 方式一: 新增 直接模型类实例化对象
def add_book(request):
book = models.Book(title="易经", price=200, publish="人民出版社", pub_date="2009-12-12")
book.save()
return HttpResponse("新增成功!")
- 方式二: 调用orm 提供的API(推荐)
def add_book(request):
book = models.Book.objects.create(title="易筋经", price=120, publish="少林出版社", pub_date="2006-12-12")
book = models.Book.objects.create(title="独孤九剑", price=170, publish="华山出版社", pub_date="2015-12-12")
return HttpResponse("新增成功!")
查询表记录
- 查询API
def book_list(request):
# all 查询所有 返回QuerySet类型
books = models.Book.objects.all() # QuerySet类型 类似于list, 里面是一个个对象
# 类似与sql: select * from app01_book;
# filter 过滤 返回QuerySet类型
books = models.Book.objects.filter(pk=3) # QuerySet 类似于list, 满足条件的对象集
books = models.Book.objects.filter(price=200)
books = models.Book.objects.filter(publish='少林出版社', price=200) # 多个条件时,是使用and关系
# get 获取一个对象
books = models.Book.objects.get(pk=4) # 直接获取出对象 注意: 当查询条件不存在或者查询出结果有多个值时,会报错。
books = models.Book.objects.get(pk=18) # 直接获取出对象
books = models.Book.objects.get(price=200) # 直接获取出对象
# exclude # 排除满足条件的结果 返回QuerySet类型
# first()与last()
books = models.Book.objects.filter(pk=4).first()
books = models.Book.objects.filter(pk=4).last()
books = models.Book.objects.exclude(publish='少林出版社', price=200) # not 排除满足条件的对象。剩下的取出来即可。
books = models.Book.objects.order_by("price") # 默认是升序
books = models.Book.objects.order_by("-price") # 默认是降序
# reverse
books = models.Book.objects.order_by("-price").reverse() # 默认是降序
# count
books = models.Book.objects.all().count() # 统计数量
# exists
books = models.Book.objects.filter(pk=18).exists() # 返回值为布尔值
# values # 返回QuerySet类型 里面类似于字典.
books = models.Book.objects.filter(price=200).values("title", "price") # QuerySet {'title': '易经', 'price': Decimal('200.00')}
# values_list # 返回QuerySet类型 里面类似于元组
books = models.Book.objects.filter(price=200).values_list("title", "price") # QuerySet ('易经', Decimal('200.00')),
# distinct() # 去重
books = models.Book.objects.filter(price=200).values_list("price").distinct()
return HttpResponse("查询成功!")
- 基于双下划线的模糊查询
def book_list(request):
books = models.Book.objects.filter(price__in=[100,200,300]) # 在... 里
books = models.Book.objects.filter(price__gt=100) # 大于
books = models.Book.objects.filter(price__lt=100) # 小于
books = models.Book.objects.filter(price__range=[100, 200]) # 包含后面的数字 左闭右闭
books = models.Book.objects.filter(title__contains="法") # 包含...
books = models.Book.objects.filter(title__icontains="python") # 不区分大小写
books = models.Book.objects.filter(title__startswith="九") # 以...开头
books = models.Book.objects.filter(pub_date__year=2018) # 通过年份过滤
return HttpResponse("查询成功!")
删除表记录
- 方式一 调用QuerySet的delete方法
会模仿 SQL 约束ON DELETE CASCADE
的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。
def del_book(request):
pk = request.GET.get("pk")
books = models.Book.objects.filter(pk=pk).delete()
return HttpResponse("删除成功!")
- 方式二 obj.delete()
运行时立即删除对象而不返回任何值
def del_book(request):
pk = request.GET.get("pk")
books = models.Book.objects.filter(pk=pk).first()
books.delete()
return HttpResponse("删除成功!")
修改表记录
- 方式一: 调用QuerySet的
update()
方法
def edit_book(request):
pk = request.GET.get("pk")
books = models.Book.objects.filter(pk=pk).update(price=280)
books = models.Book.objects.filter(pk=pk).update(price=290,publish='华山出版社')
return HttpResponse("编辑成功!")
update()
方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()
方法会返回一个整型数值,表示受影响的记录条数
- 方式二: obj更改属性值, 必须要
save()
同步到数据库。
def edit_book(request):
pk = request.GET.get("pk")
books = models.Book.objects.filter(pk=pk).first()
books.price = 189
books.save()
return HttpResponse("编辑成功!")