第六篇:单表操作

6.1ORM简介

查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装,不用sql语句就能操作数据库

  • MVC或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
  • ORM是“对象-关系-映射”的简称。                                      

#sql中的表                                                      

 #创建表:
     CREATE TABLE employee(                                     
                id INT PRIMARY KEY auto_increment ,                    
                name VARCHAR (20),                                      
                gender BIT default 1,                                  
                birthday DATA ,                                         
                department VARCHAR (20),                                
                salary DECIMAL (8,2) unsigned,                          
              );


  #sql中的表纪录                                                  

  #添加一条表纪录:                                                          
      INSERT employee (name,gender,birthday,salary,department)            
             VALUES   ("alex",1,"1985-12-12",8000,"保洁部");               

  #查询一条表纪录:                                                           
      SELECT * FROM employee WHERE age=24;                               

  #更新一条表纪录:                                                           
      UPDATE employee SET birthday="1989-10-24" WHERE id=1;              

  #删除一条表纪录:                                                          
      DELETE FROM employee WHERE name="alex"                             





#python的类
class Employee(models.Model):
     id=models.AutoField(primary_key=True)
     name=models.CharField(max_length=32)
     gender=models.BooleanField()
     birthday=models.DateField()
     department=models.CharField(max_length=32)
     salary=models.DecimalField(max_digits=8,decimal_places=2)


 #python的类对象
      #添加一条表纪录:
          emp=Employee(name="alex",gender=True,birthday="1985-12-12",epartment="保洁部")
          emp.save()
      #查询一条表纪录:
          Employee.objects.filter(age=24)
      #更新一条表纪录:
          Employee.objects.filter(id=1).update(birthday="1989-10-24")
      #删除一条表纪录:
          Employee.objects.filter(name="alex").delete()
示例

6.2配置orm的环境

-数据迁移命令:
-python3 manage.py makemigrations   --->只是对变化做一个记录,记录文件在app的migrations
-python3 manage.py migrate   ---->把更改提交到数据库
-python3 manage.py showmigrations  ---->查看哪个没有提交到数据库

setting的配置

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

    }
}

modles的配置

from django.db import models


# Create your models here.

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish = models.CharField(max_length=32)
    author = models.CharField(max_length=32)
    create_data=models.DateField(null=True)
    def __str__(self):
        return '书名:%s,价格:%s 出版时间:%s'%(self.name,self.price,self.create_data)

__init__文件

import pymysql
# 因为django默认链接mysql数据库,用的是MySQLdb模块,
# python3.0以后,不支持MySQLdb,需要用pymysql替换MySQLdb
pymysql.install_as_MySQLdb()

最后进行数据库迁移

相关命令

-python3 manage.py makemigrations   --->只是对变化做一个记录,记录文件在app的migrations
-python3 manage.py migrate   ---->把更改提交到数据库
-python3 manage.py showmigrations  ---->查看那个没有提交到数据库

6.3在python脚本中调用Django环境

import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled10.settings")
    import django
    django.setup()

    from app07 import models

    books = models.Book.objects.all()
    print(books)

6.4单表操作

test.py文件

import os

if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day76orm.settings")
    import django

    django.setup()

    from app01 import models
    # ****************新增*********插入数据的两种方式
    # 方式一 :返回结果是一个对象
    # book=models.Book.objects.create(name='红楼梦',price=23.8,publish='人民出版社',author='曹雪芹',create_data='2018-09-17')
    # print(book.name)
    # 方式二:先实例化产生对象,然后调用save方法,保存
    # book=models.Book(name='水浒传',price=99.8,publish='老男孩出版社',author='施耐庵',create_data='2018-08-08')
    # book.save()
    # print(book.name)
    # 时间格式,可以传字符串,可以传日期格式
    # import datetime
    #
    # ctime = datetime.datetime.now()
    # book = models.Book.objects.create(name='西游记', price=73.8, publish='北京出版社', author='吴承恩', create_data=ctime)
    # print(book.name)
    # #删除******************
    # 删除名字叫西游记的这本书
    # ret=models.Book.objects.filter(name='西游记').delete()
    # print(ret)
    # 删除的第二种方式:
    # ret = models.Book.objects.filter(name='西游记').first()
    # ret.delete()
    # **************修改
    # ret=models.Book.objects.filter(name='西游记').update(price=20.9)
    # 对象修改(没有update方法,但是可以用save来修改)
    # book = models.Book.objects.filter(name='西游记').first()
    # book.price=89
    # book.save()
    # 查询************************重点************************
    # (1)all()
    # ret=models.Book.objects.all()
    # print(ret)
    # filter()
    # 查询名字叫西游记的这本书
    # ret=models.Book.objects.filter(name='西游记').first()
    # 不支持负数,只支持正数
    # ret=models.Book.objects.filter(name='西游记')[-1]
    # print(ret)
    # filter内可以传多个参数,用逗号分隔,他们之间是and的关系
    # ret=models.Book.objects.filter(name='西游记',price='73.8')
    # # ret.query -->queryset对象打印sql
    # print(ret.query)
    #get() 有且只有一个结果,才能用,如果有一个,返回的是对象,
    # 不是queryset对象,通常用在,用id查询的情况
    # ret=models.Book.objects.get(name='红楼梦')
    # ret=models.Book.objects.get(id=1)
    # print(type(ret))
    #     exclude()查询名字不叫西游记的书,结果也是queryset对象
    '''
        SELECT
        `app01_book`.`id`,
        `app01_book`.`name`,
        `app01_book`.`price`,
        `app01_book`.`publish`,
        `app01_book`.`author`,
        `app01_book`.`create_data`
    FROM
        `app01_book`
    WHERE
        NOT (
            `app01_book`.`name` = 西游记
            AND `app01_book`.`price` = 23.8
        )
    '''
    # ret=models.Book.objects.exclude(name='西游记',price='23.8')
    # print(ret)
    # print(ret.query)
    # order_by 按价格升序排
    # ret=models.Book.objects.all().order_by('price')
    # print(ret)
    # queryset对象可以继续 点 方法
    # ret=models.Book.objects.all().order_by('price').filter(name='西游记')
    # print(ret)
    # 按价格倒序排
    # ret=models.Book.objects.all().order_by('-price')
    # print(ret)
    # 可以传多个
    # ret=models.Book.objects.all().order_by('-price','create_data')
    # print(ret)
    # print(ret.query)
    # reverse 对结果进行反向排序
    # ret=models.Book.objects.all().order_by('-price').reverse()
    # print(ret)
    # print(ret.query)
    # count  查询结果个数
    # ret=models.Book.objects.all().count()
    # ret=models.Book.objects.all().filter(name='西游记').count()
    # print(ret)
    # last 返回book对象
    # ret=models.Book.objects.all().last()
    # print(ret)
    # exists 返回结果是布尔类型
    # ret=models.Book.objects.filter(name='三国演义').exists()
    # print(ret)

    # values(*field): queryset对象里套字典
    # ret=models.Book.objects.all().values('name','price')
    # ret=models.Book.objects.all().values('name')
    # print(ret)
    # value_list queryset对象里套元组
    # ret=models.Book.objects.all().values_list('name','price')
    # print(ret)
    # distinct() 必须完全一样,才能去重   只要带了id,去重就没有意义了
    # ret=models.Book.objects.all().values('name').distinct()
    # print(ret)

 6.5基于双下划线的模糊查询

    # 查询价格大于89 的书
    # ret=models.Book.objects.filter(price__gt='89')
    # print(ret)
    # 查询价格小于89 的书
    # ret=models.Book.objects.filter(price__lt='89')
    # print(ret)

    # ret=models.Book.objects.filter(price__lt='89',price='89')
    # 小于等于
    # ret=models.Book.objects.filter(price__lte='89')
    # 大于等于,
    # ret = models.Book.objects.filter(price__gte='89')
    # print(ret)
    # in 在XX中
    # ret=models.Book.objects.filter(price__in=['23.8','89','100'])
    # print(ret)
    # print(ret.query)
    # range 在XX范围内 between and
    # ret=models.Book.objects.filter(price__range=[50,100])
    # print(ret.query)
    # contains  查询名字有'%红%'的书
    # ret=models.Book.objects.filter(name__contains='红')
    # print(ret)
    # print(ret.query)
    # icontains 查询名字带p的书,忽略大小写
    # ret=models.Book.objects.filter(name__icontains='P')
    # print(ret)
    # print(ret.query)
    #     startswith  以XX开头
    # ret=models.Book.objects.filter(name__startswith='红')
    # print(ret)
    # print(ret.query)
    # endswith
    # ret=models.Book.objects.filter(name__endswith='梦')
    # print(ret)

    # pub_date__year 按年查询
    # ret=models.Book.objects.filter(create_data__year='2017')
    # print(ret)

 

posted @ 2019-03-14 22:08  王苗鲁  阅读(140)  评论(0编辑  收藏  举报