08 批量插入数据
django orm简介
# 什么是ORM?
ORM:对象关系映射
# 为什么要用ORM?
能够让不会写SQL语句的python程序员
使用面向对象的语法即可简单快捷的操作MySQL,极大地提升开发效率
'''但是ORM有时候自动生成的SQL效率可能会很低'''
类 表
对象 一行行记录
对象点属性 记录某个字段对应的值
# 如何使用ORM?
在django应用文件夹下的models.py中操作
"""orm无法创建库 需要自己提前创建好"""
项目需求:浏览器中访问django后端某一条url(如:127.0.0.1:8080/index/),实时朝数据库中生成一千条数据并将生成的数据查询出来,并展示到前端页面
urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^get_book/',views.get_book)
]
models.py
"""
强调:只要在models.py中改动了与数据库相关的代码 就必须要重新执行迁移命令
"""
# 1.先在models.py中书写类相关的代码
from django.db import models
# Create your models here.
class User(models.Model): # create table User
id = models.AutoField(verbose_name='编号', primary_key=True) # id int primary key auto_increment comment '编号'
name = models.CharField(verbose_name='姓名', max_length=32) # name varchar(32) comment '姓名'
pwd = models.IntegerField(verbose_name='密码')
# 2.点击Terminal,执行数据库迁移命令
python3 manage.py makemigrations # 将改动记到小本本上(migrations)
python3 manage.py migrate # 真正操作数据库
"""pycharm快捷提示(tools>>>run manage.py task)"""from django.db import models
class Book(models.Model):
title = models.CharField(max_length=64)
# 点击Terminal,执行数据库迁移命令
python3 manage.py makemigrations # 将改动记到小本本上(migrations)
python3 manage.py migrate # 真正操作数据库
"""pycharm快捷提示(tools>>>run manage.py task)"""
views.py
from django.shortcuts import render, HttpResponse, redirect
from app01 import models
def get_book(request):
# for循环插入1000条数据
for i in range(1000):
models.Book.objects.create(name='第%s本书'%i)
# 将插入的数据再查询出来
book_queryset = models.Book.objcets.all()
return render(request,'get_book.html',locals()) # 将查询出来的数据传递给html页面
补充
1.主键字段orm会自动创建 只不过名字固定为id
2.CharField字段类型必须要有max_length参数
字段增删改查
# 当表中已经有数据存在的情况下如果添加新的字段那么需要设置null或者default
password = models.IntegerField(verbose_name='密码',null=True) # pwd int comment '密码'
age = models.IntegerField('年龄',default=18)
数据增删改查
# 点击 Python Console
from app01 import models # 定义models模块
# 查
models.User.objects.all() # 查询user表中所有的数据
# select * from user;
<QuerySet [<User: jason>, <User: tony>, <User: kevin>]> # 结果集
models.User.objects.filter(name='jason') # 查询name=jason的数据
# select * from user where name='jason'
<QuerySet [<User: jason>]> # 结果集
user_obj = models.User.objects.filter(name='jason')[0]
user_obj.name
'jason'
user_obj.password
123
models.User.objects.filter(name='jason',password=123)
# select * from user where name='jason' and password=123
<QuerySet [<User: jason>]>
"""
QuerySet我们可以简单的理解为是列表套一个个数据对象
"""
# 增
models.User.objects.create(name='jerry',password=567)
# insert into user(name,password) values('jerry',567)
上述orm返回值为当前被创建出来的数据对象本身
obj = models.User(name='tom',password=111) # 类产生对象
obj.password=123 # 可在保存之前修改数据
obj.save() # 对象调用save方法保存到数据库
# 改
edit_obj = models.User.objects.filter(id=3)[0]
edit_obj.name = 'kevinSB'
edit_obj.save()
models.User.objects.filter(name='jason').update(name='jasonNB')
# update user set name='jasonNB' where name='jason';
# 删
models.User.objects.filter(id=5).delete()
# delete from user where id=5;
课堂练习
1.查看当前所有表数据(前端展示) /home/
2.书写用户注册页面(前端展示) /register/
3.编辑用户数据
4.删除用户
"""
重在思路
"""
urls.yp
urlpatterns = [ url(r'^admin/', admin.site.urls), # 数据展示页 url(r'^home/',views.home), # 数据录入页 url(r'^register/',views.register), # 数据删除页 url(r'^data_delete/',views.data_delete), # 数据编辑页 url(r'^data_edit/',views.data_edit) ]
views.py
from django.shortcuts import render, HttpResponse, redirect from app01 import models # Create your views here. def home(request): # 1.查询user表中所有的数据 user_data = models.User.objects.all() # queryset [数据对象,数据对象,...] # 2.将数据利用模板语法传递给html文件 return render(request, 'home.html', locals()) # {'user_data':user_data} def register(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 先比对用户名是否重复 is_exists = models.User.objects.filter(name=username) # queryset[] if is_exists: return HttpResponse('用户名已存在') # 将用户数据写入数据库 models.User.objects.create(name=username, password=password) # 返回数据展示页 return redirect('/home/') return render(request, 'register.html') def data_delete(request): # 获取用户需要删除的数据主键值 delete_id = request.GET.get('delete_id') models.User.objects.filter(id=delete_id).delete() # 再次返回数据展示页 return redirect('/home/') def data_edit(request): # 1.获取用户需要修改的数据主键值 edit_id = request.GET.get('edit_id') if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 修改表数据 models.User.objects.filter(id=edit_id).update(name=username, password=password) # 返回展示页 return redirect('/home/') # 2.根据主键值查询具体数据 edit_obj = models.User.objects.filter(id=edit_id).first() # queryset[] '''filter 的结果是一个queryset,可以看成是列表套数据对象,在取值的时候可以用索引,但推荐使用first方法''' # 3.返回给用户一个编辑页面,上面提前写好用户需要编辑的数据 return render(request, 'edit_data.html', locals())
home.html
<div class="container"> <div class="row"> <h1 class="text-center">数据展示</h1> <div class="col-md-8 col-md-offset-2"> <a href="/register/" class="btn btn-primary">用户注册</a> <table class="table table-hover table-striped"> <thead> <tr> <th>id</th> <th>name</th> <th>password</th> <th>operate</th> </tr> </thead> <tbody> {% for user_obj in user_data %} <tr> <td>{{ user_obj.id }}</td> <td>{{ user_obj.name }}</td> <td>{{ user_obj.password }}</td> <td> <a href="/data_edit/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a> {# 通过GET请求,url后面携带id的方式获取#} <a href="/data_delete/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> </div>
register.py
<div class="container"> <div class="row"> <h1 class="text-center">用户注册</h1> <div class="col-md-8 col-md-offset-2"> <form action="" method="post"> <p>username: <input type="text" name="username" class="form-control"> </p> <p>password: <input type="text" name="password" class="form-control"> </p> <input type="submit" value="注册" class="btn btn-block btn-success"> </form> </div> </div> </div>
edit_data.html
<div class="container"> <div class="row"> <h1 class="text-center">编辑用户</h1> <div class="col-md-8 col-md-offset-2"> <form action="" method="post"> <p>username: <input type="text" name="username" class="form-control" value="{{ edit_obj.name }}"> </p> <p>password: <input type="text" name="password" class="form-control" value="{{ edit_obj.password }}"> </p> <input type="submit" value="编辑" class="btn btn-block btn-success"> </form> </div> </div> </div>
orm外键创建
一对多外键关系 """在orm中 外键字段建在多的一方""" 多对多外键关系 """在orm中 可以直接写在查询频率较高的表中(自动创建第三张表)""" 一对一外键关系 """在orm中 直接写在查询频率较高的表中""" # 一对多 publish = models.ForeignKey(to='Publish') # 多对多 authors = models.ManyToManyField(to='Author') # 自动创建书籍和作者的第三张关系表 # 一对一 author_detail = models.OneToOneField(to='AuthorDetail') """ ForeignKey OneToOneField 会自动给字段加_id后缀 """ class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_places=2) # 一对多 publish = models.ForeignKey(to='Publish') # 多对多 authors = models.ManyToManyField(to='Author') # 自动创建书籍和作者的第三张关系表 class Publish(models.Model): title = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32) # 一对一 author_detail = models.OneToOneField(to='AuthorDetail') class AuthorDetail(models.Model): addr = models.CharField(max_length=32) phone = models.BigIntegerField()
bulk_create方法
将views.py中原先的视图函数稍作变化
def book(request): l = [] for i in range(10000): l.append(models.Book(title='第%s本书'%i)) models.Book.objects.bulk_create(l) # 批量插入数据 return render(request,'booklist.html',locals())
代码修改完毕之后其他地方无需改动,重启django项目浏览器重新访问,你会立马发现数据量增大十倍的情况下页面出现的速度居然还比上面的版本要快上速度倍!!!
bulk_create方法是django orm特地提供给我们的方便批量操作数据库的方式,效率非常高!!!