第六篇:单表操作
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)