Django的ORM简介

概念

Object Relational Mapping—-对象关系映射

优点

不用直接编写SQL代码,只需要像操作对象一样操作数据库

操作逻辑

  1. 在MySQL中建立数据库
  2. 在模型文件下书写类及函数
  3. 完成二者映射,在数据库表中可以查询到数据

数据库连接配置

MySQL的用户配置

  1. mysql> show databases;
  2. +--------------------+
  3. | Database |
  4. +--------------------+
  5. | information_schema |
  6. | mysql |
  7. | performance_schema |
  8. | sakila |
  9. | sys |
  10. | world |
  11. +--------------------+
  12. 6 rows in set (0.04 sec)
  13. mysql> create database book charset=utf8;
  14. Query OK, 1 row affected, 1 warning (0.01 sec)
  15. mysql> create user tz identified by 'tz123';
  16. Query OK, 0 rows affected (0.04 sec)
  17. mysql> grant all on book.* to 'tz'@'%' with grant option;
  18. Query OK, 0 rows affected (0.01 sec)
  19. mysql>

验证创建结果

  1. C:\Users\41999>mysql -u tz -p
  2. Enter password: *****
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 10
  5. Server version: 8.0.24 MySQL Community Server - GPL
  6. Copyright (c) 2000, 2021, Oracle and/or its affiliates.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql> show databases;
  12. +--------------------+
  13. | Database |
  14. +--------------------+
  15. | book |
  16. | information_schema |
  17. +--------------------+
  18. 2 rows in set (0.00 sec)
  19. mysql> \q
  20. Bye

在settings中配置数据库

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
  4. 'NAME': 'book', #数据库名称
  5. 'USER': 'tz', # 链接数据库的用户名
  6. 'PASSWORD': 'tz123', # 链接数据库的密码
  7. 'HOST': '127.0.0.1', # mysql服务器的域名和ip地址
  8. 'PORT': '3306', # mysql的一个端口号,默认是3306
  9. }
  10. }

在项目init下配置数据库

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

包准备

  1. ## 用于操作的包
  2. pip install cryptography
  3. pip install PyMySQL
  4. --------------------------------------------------------------------------->
  5. ## views.py视图中使用的包
  6. from django.shortcuts import render
  7. from .models import User
  8. from django.http import HttpResponse
  9. --------------------------------------------------------------------------->

模型使用方法

  1. ###数据库表名
  2. 模型类如果未指明表名,Django默认以小写**app应用名_小写模型类名为数据库表名**。
  3. 可通过**db_table**指明数据库表名。
  4. ###关于主键
  5. django会为表创建**自动增长**的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
  6. 默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key
  7. ###属性命名限制
  8. 不能是python的保留关键字。
  9. 不允许使用连续的下划线,这是由django的查询方式决定的。
  10. 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
  11. 属性=models.字段类型(选项)

模型的创建和映射

模型文件的书写

  1. from django.db import models
  2. # Create your models here.
  3. """
  4. 继承自谁models
  5. 模型类和数据库关系
  6. 属性和表字段对应的关系
  7. """
  8. class User(models.Model):
  9. name = models.CharField(max_length=20)
  10. age = models.IntegerField() # 年龄一般均为1-100,所以指定长度没有太大的意义,但这可能成为一个攻击点
  11. gender = models.BooleanField()
  12. class Meta:
  13. db_table = 'user' # 指定表名
  14. def __str__(self):
  15. return self.name

数据迁移过程

  1. (tzblog) C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py check
  2. C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
  3. System check identified no issues (0 silenced).
  4. C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py makemigrations book
  5. C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
  6. Migrations for 'book':
  7. book\migrations\0001_initial.py
  8. - Create model User
  9. C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py migrate
  10. C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
  11. Operations to perform:
  12. Apply all migrations: admin, auth, book, contenttypes, sessions
  13. Running migrations:
  14. Applying contenttypes.0001_initial... OK
  15. Applying auth.0001_initial... OK
  16. Applying admin.0001_initial... OK
  17. Applying admin.0002_logentry_remove_auto_add... OK
  18. Applying contenttypes.0002_remove_content_type_name... OK
  19. Applying auth.0002_alter_permission_name_max_length... OK
  20. Applying auth.0003_alter_user_email_max_length... OK
  21. Applying auth.0004_alter_user_username_opts... OK
  22. Applying auth.0005_alter_user_last_login_null... OK
  23. Applying auth.0006_require_contenttypes_0002... OK
  24. Applying auth.0007_alter_validators_add_error_messages... OK
  25. Applying auth.0008_alter_user_username_max_length... OK
  26. Applying auth.0009_alter_user_last_name_max_length... OK
  27. Applying book.0001_initial... OK
  28. Applying sessions.0001_initial... OK

查看迁移过程

  1. C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook>python manage.py sqlmigrate book 0001
  2. C:\Users\41999\Documents\项目管理\duplicate\tzblog\Scripts\tzlook
  3. BEGIN;
  4. --
  5. -- Create model User
  6. --
  7. CREATE TABLE `user` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL, `age` integer NOT NULL, `gender` bool NOT NULL
  8. );
  9. COMMIT;

数据的增删改查

使用逻辑

视图层:四种增删改查的语句嵌套在视图层中定义

  1. 使用HttpResponse返回查询结果,

HTML5:展示能否操作成功,而非查询结果

URL:负责调用视图函数,相当于输入查询语句之后的回车确认

查询接口渲染

HTML5文件内容

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>演示数据库的增删改查</title>
  6. </head>
  7. <body>
  8. <a href="#">{{user}}}</a>
  9. </body>
  10. </html>

增加数据

  1. ###urls.py
  2. --------------------------------------------------------------------------
  3. path('add_user/', views.add_user, name='add_user'), # 测试数据库操作中的的增加
  4. ###views.py
  5. ---------------------------------------------------------------------------
  6. ef add_user(request):
  7. '''
  8. 测试数据库的增加操作
  9. '''
  10. user = User(name='小鱼儿', age=17, gender=False) # 字段值的写入一定要与其属性匹配
  11. user.save()
  12. return HttpResponse('添加成功')

查询数据

  1. ###urls.py
  2. --------------------------------------------------------------------------
  3. path('search_user/', views.search_user, name='search_user'), # 测试数据库操作中的查询
  4. ###views.py
  5. ---------------------------------------------------------------------------
  6. def search_user(request):
  7. '''
  8. 查询数据
  9. '''
  10. search = User.objects.all()
  11. # print(search)
  12. # return HttpResponse('查询成功,结果为:{}'.format(search))
  13. return HttpResponse('查询成功!')
  14. # return render(request, 'database-book.html', context=search)

删除数据

  1. ###urls.py
  2. --------------------------------------------------------------------------
  3. path('delete_user/', views.delete_user, name='delete_user'), # 删除数据库中的值
  4. ###views.py
  5. ---------------------------------------------------------------------------
  6. def delete_user(request):
  7. '''
  8. 通过指定ID,删除数据
  9. '''
  10. User.objects.get(id=2).delete()
  11. return HttpResponse('删除成功')

更新数据(三种方式)

  1. ###urls.py
  2. --------------------------------------------------------------------------
  3. path('update_user/', views.update_user, name='update_user'), # 更新数据库中的值
  4. --------------------------------------------------------------------------->
  5. path('modified_user/', views.modified_user, name='modified_user'), # 第二种更新数据库中的值
  6. --------------------------------------------------------------------------->
  7. path('ModifiedWholeFiled/', views.ModifiedWholeFiled, name='ModifiedWholeFiled'), # 第二种更新数据库中的值
  8. ###views.py
  9. ---------------------------------------------------------------------------
  10. def update_user(request):
  11. '''
  12. 修改成功
  13. '''
  14. user = User.objects.get(name='画龙老师')
  15. user.name = '徐媛老师'
  16. user.save()
  17. return HttpResponse('更新成功')
  18. --------------------------------------------------------------------------->
  19. def modified_user(request):
  20. ''''
  21. 修改数据,使用User.objects.filter().update()
  22. '''
  23. User.objects.filter(name='斗鱼').update(name='熊猫TV')
  24. return HttpResponse('第二种方法修改数据成功')
  25. --------------------------------------------------------------------------->
  26. def ModifiedWholeFiled(request):
  27. ''''
  28. 修改数据整个字段
  29. '''
  30. User.objects.update(age=18)
  31. return HttpResponse('修改全部字段成功')

参考与引用

[数据库连接报错]:DBeaver连接mysql时Public Key Retrieval is not allowed错误解决附图片_qq_42816401的博客-CSDN博客

[链接数据库时包缺失]:‘cryptography‘ package is required for sha256_password or caching_sha2_password auth methods_fwpevil的博客-CSDN博客

工具准备

  1. ### 可视化数据库---dbeaver
  2. https://dbeaver.io/download/