Django的ORM简介
概念
Object Relational Mapping—-对象关系映射
优点
不用直接编写SQL代码,只需要像操作对象一样操作数据库
操作逻辑
- 在MySQL中建立数据库
- 在模型文件下书写类及函数
- 完成二者映射,在数据库表中可以查询到数据
数据库连接配置
MySQL的用户配置
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sakila || sys || world |+--------------------+6 rows in set (0.04 sec)mysql> create database book charset=utf8;Query OK, 1 row affected, 1 warning (0.01 sec)mysql> create user tz identified by 'tz123';Query OK, 0 rows affected (0.04 sec)mysql> grant all on book.* to 'tz'@'%' with grant option;Query OK, 0 rows affected (0.01 sec)mysql>
验证创建结果
C:\Users\41999>mysql -u tz -pEnter password: *****Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 10Server version: 8.0.24 MySQL Community Server - GPLCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;+--------------------+| Database |+--------------------+| book || information_schema |+--------------------+2 rows in set (0.00 sec)mysql> \qBye
在settings中配置数据库
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 数据库引擎'NAME': 'book', #数据库名称'USER': 'tz', # 链接数据库的用户名'PASSWORD': 'tz123', # 链接数据库的密码'HOST': '127.0.0.1', # mysql服务器的域名和ip地址'PORT': '3306', # mysql的一个端口号,默认是3306}}
在项目init下配置数据库
import pymysqlpymysql.install_as_MySQLdb()
包准备
## 用于操作的包pip install cryptographypip install PyMySQL--------------------------------------------------------------------------->## views.py视图中使用的包from django.shortcuts import renderfrom .models import Userfrom django.http import HttpResponse--------------------------------------------------------------------------->
模型使用方法
###数据库表名模型类如果未指明表名,Django默认以小写**app应用名_小写模型类名为数据库表名**。可通过**db_table**指明数据库表名。###关于主键django会为表创建**自动增长**的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。###属性命名限制不能是python的保留关键字。不允许使用连续的下划线,这是由django的查询方式决定的。定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:属性=models.字段类型(选项)
模型的创建和映射
模型文件的书写
from django.db import models# Create your models here."""继承自谁models模型类和数据库关系属性和表字段对应的关系"""class User(models.Model):name = models.CharField(max_length=20)age = models.IntegerField() # 年龄一般均为1-100,所以指定长度没有太大的意义,但这可能成为一个攻击点gender = models.BooleanField()class Meta:db_table = 'user' # 指定表名def __str__(self):return self.name
数据迁移过程
(tzblog) C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py checkC:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlookSystem check identified no issues (0 silenced).C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py makemigrations bookC:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlookMigrations for 'book':book\migrations\0001_initial.py- Create model UserC:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py migrateC:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlookOperations to perform:Apply all migrations: admin, auth, book, contenttypes, sessionsRunning migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying book.0001_initial... OKApplying sessions.0001_initial... OK
查看迁移过程
C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py sqlmigrate book 0001C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlookBEGIN;---- Create model User--CREATE TABLE `user` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL, `age` integer NOT NULL, `gender` bool NOT NULL);COMMIT;
数据的增删改查
使用逻辑
视图层:四种增删改查的语句嵌套在视图层中定义
使用HttpResponse返回查询结果,
HTML5:展示能否操作成功,而非查询结果
URL:负责调用视图函数,相当于输入查询语句之后的回车确认
查询接口渲染
HTML5文件内容
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>演示数据库的增删改查</title></head><body><a href="#">{{user}}}</a></body></html>
增加数据
###urls.py--------------------------------------------------------------------------path('add_user/', views.add_user, name='add_user'), # 测试数据库操作中的的增加###views.py---------------------------------------------------------------------------ef add_user(request):'''测试数据库的增加操作'''user = User(name='小鱼儿', age=17, gender=False) # 字段值的写入一定要与其属性匹配user.save()return HttpResponse('添加成功')
查询数据
###urls.py--------------------------------------------------------------------------path('search_user/', views.search_user, name='search_user'), # 测试数据库操作中的查询###views.py---------------------------------------------------------------------------def search_user(request):'''查询数据'''search = User.objects.all()# print(search)# return HttpResponse('查询成功,结果为:{}'.format(search))return HttpResponse('查询成功!')# return render(request, 'database-book.html', context=search)
删除数据
###urls.py--------------------------------------------------------------------------path('delete_user/', views.delete_user, name='delete_user'), # 删除数据库中的值###views.py---------------------------------------------------------------------------def delete_user(request):'''通过指定ID,删除数据'''User.objects.get(id=2).delete()return HttpResponse('删除成功')
更新数据(三种方式)
###urls.py--------------------------------------------------------------------------path('update_user/', views.update_user, name='update_user'), # 更新数据库中的值--------------------------------------------------------------------------->path('modified_user/', views.modified_user, name='modified_user'), # 第二种更新数据库中的值--------------------------------------------------------------------------->path('ModifiedWholeFiled/', views.ModifiedWholeFiled, name='ModifiedWholeFiled'), # 第二种更新数据库中的值###views.py---------------------------------------------------------------------------def update_user(request):'''修改成功'''user = User.objects.get(name='画龙老师')user.name = '徐媛老师'user.save()return HttpResponse('更新成功')--------------------------------------------------------------------------->def modified_user(request):''''修改数据,使用User.objects.filter().update()'''User.objects.filter(name='斗鱼').update(name='熊猫TV')return HttpResponse('第二种方法修改数据成功')--------------------------------------------------------------------------->def ModifiedWholeFiled(request):''''修改数据整个字段'''User.objects.update(age=18)return HttpResponse('修改全部字段成功')
参考与引用
[数据库连接报错]:DBeaver连接mysql时Public Key Retrieval is not allowed错误解决附图片_qq_42816401的博客-CSDN博客
工具准备
### 可视化数据库---dbeaverhttps://dbeaver.io/download/
