Python笔记_49_ORM_单表查询

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, 添加记录时它会自动增长.
BooleanFieldA 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 作为其中一个选项.
SlugFieldslug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符
参数含义
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("编辑成功!")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值