python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查 Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够对数据库进行增删改查,进行各种操作。

python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

Django中的ORM简介

ORM概念:对象关系映射(Object Relational Mapping,简称ORM):

用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够对数据库进行增删改查,进行各种操作。我们只需要对python的面向对象熟悉,就可以很清晰的知道各种数据之间的关系。

 

django模型映射关系: 

 


数据库连接配置

Django支持主流的数据库,都有配置,在setting中配置即可,下面我们看下如何配置MySQL。

db.sqlite3文件的说明

db.sqlite3文件也是数据库文件,Django默认情况下,会配置这个文件,这个文件很小,很多单机、net的用的是这个 

 

Django 连接MySQL的配置流程:

  • 安装 pymysql,用于python操作mysql数据库
pip install pymysql
  • 创建数据库用户,需要有创建数据库权限的用户
  • 创建数据库
#进入数据库,此命令用的root账户。正常是用数据库管理员给的数据库账号
>>>(django) pyvip@Vip:~$ mysql -uroot -pqwe123

#创建一个叫crm的数据库
>>>mysql> create database crm;
Query OK, 1 row affected (0.00 sec)
  • 修改setting配置,
复制代码
 1 默认的是:'ENGINE': 'django.db.backends.sqlite3',需要修改为mysql
 2 DATABASES = {
 3     'default': {
 4         'ENGINE': 'django.db.backends.mysql',
 5         'NAME': 'crm',
 6         'USER': 'root',
 7         'PASSWORD': 'qwe123',
 8         'HOST': '127.0.0.1',
 9         #POST官方推荐的是字符串。
10         'POST': '3306',
11     }
12 }
复制代码

 

  • 修改项目文件夹(和setting.py文件所在的目录)下的__init__.py文件

因为历史原因,python2用的模块是MySQLdb这个模块,所以需要如此写。

#在__init__文件中配置
1 import pymysql
2 
3 pymysql.install_as_MySQLdb()

 

  • 设置时区
1  setting.py文件中设置时区
2 
3  TIME_ZONE = 'Asia/ShangHai'   #北京时间

 


模型的创建与映射(激活)

定义模型

  1. 模型类必须写在app下的models.py文件中。
  2. 模型如果需要映射到数据库,所在的app必须被安装。
  3. 一个数据表对应一个模型类,表中的字段,对应模型中的类属性。

在models文件中创建模型:

复制代码
 1  from django.db import models
 2     
 3     #必须继承'models.Model'
 4     class Students(models.Model):
 5     
 6         #模型会自动创建主键,djiano会自动创建一个字段为'id'的主键。
 7         id一般不用创建
 8         
 9         name = models.CharField(max_length=20)
10         age = models.SmallIntegerField(default=0)
11         sex = models.SmallIntegerField(default=1)
12         qq = models.CharField(max_length=20, default='')
13         phone = models.CharField(max_length=20, default='')
14         c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
15     
16         #__str__代码是为了在ipython调试中方便查看数据,对数据库不造成任何影响,不用做数据库迁移
17         def __str__(self):
18             return '%s-%s' % (self.name, self.age)
复制代码
复制代码
    解析:
    CharField:字符字段,必须提供max_length这个参数,CharField的defaul最好不要给None。
    SmallIntegerField:int类型
    max_length:长度
    default:默认值,可以给'',如果不填,就是默认的。
    auto_now_add=True 在创建对象的时候,自动把当前时间记录下来。
    verbose_name:第一个位置参数,人类看的,如果没有提供这个字典,则直接使用它的变量
    
    qq、phone给的CharField不用SmallIntegerField类型的,是因为字符串更好操作,不容易出错。
复制代码

 

  1. 每一个模型都是django.db.models.Model的子类(类的继承)。
  2. 每个模型都有许多的类变量,它会表示模型中的数据库字段。
  3. 每一个字段都由一个字段类的实例来表示。

激活模型:

  1. 在项目中注册app
1 INSTALLED_APPS = [
2     'teacher.apps.TeacherConfig',
3 ]
  1. 运行数据库迁移命令(一定要在项目根目录下) 告诉django,我们做了哪些数据库的更改
复制代码
'python manage.py makemigrations teacher'
#如果不写teacher这个,则是运行INSTALLED_APPS下面所有注册的app

>>> (django) pyvip@Vip:~/code/crm$ python manage.py makemigrations teacher
Migrations for 'teacher':
  teacher/migrations/0001_initial.py
    - Create model Students
复制代码

 

运行成功后,会生成一个数据库迁移文件

现在还没有真正的操作数据库

 

sqlmigrate,从迁移获取SQL语句

复制代码
'python manage.py sqlmigrate teacher 0001'

>>>(django) pyvip@Vip:~/code/crm$ python manage.py sqlmigrate teacher 0001
BEGIN;
-- 
-- Create model Students
--
CREATE TABLE `teacher_students` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL, `age` smallint NOT NULL, `sex` smallint NOT NULL, `qq` varchar(20) NOT NULL, `phone` varchar(20) NOT NULL, `c_time` datetime(6) NOT NULL);
COMMIT;

#创建的表名是:appname_模型name.lower(小写)
复制代码

 

  1. 运行migrate命令,使迁移生效
复制代码
#这里的teacher不写则默认生成所有的表
'python manage.py migrate teacher'

>>>(django) pyvip@Vip:~/code/crm$ python manage.py migrate teacher
Operations to perform:
  Apply all migrations: teacher
Running migrations:
  Applying teacher.0001_initial... OK

#执行了teacher.0001_initial这个里面的tables。
复制代码

 

我们查看下是否创建了

复制代码
>>>mysql> show tables;
+-------------------+
| Tables_in_crm     |
+-------------------+
| django_migrations |
| teacher_students  |
+-------------------+
2 rows in set (0.00 sec)

这里生成了两张表:
    第一张表用来记录django的migrations
    第二张表是我们需要的数据表
复制代码

 

查看表结构:

复制代码
>>>mysql> desc teacher_students;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | NO   |     | NULL    |                |
| age    | smallint(6) | NO   |     | NULL    |                |
| sex    | smallint(6) | NO   |     | NULL    |                |
| qq     | varchar(20) | NO   |     | NULL    |                |
| phone  | varchar(20) | NO   |     | NULL    |                |
| c_time | datetime(6) | NO   |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

#此处表可以看到会根据我们的定义的模型来创建。
复制代码

 


MySQL数据库的增删改查

django shell调试工具

在进入之前建议安装ipython(pip安装),使用会更方便

进入到调试工具
>>>python manage.py shell

 

增加

#导入模型
#导入我们需要调试的数据模型
>>>from teacher.models import Students

 

查询模型中是否有数据

objects是模型的一个属性(方法),object的管理器

>>>Students.objects  
<django.db.models.manager.Manager at 0xb2e0fe0c>

 

查询模型中的所有的值

>>>Students.objects.all()
<QuerySet []>

#此时我们还未添加数据,所以此处为空
返回的值是QuerySet的一个查询集
第一种方式,创建一条数据
有default的不写默认是他自定的数据。
>>>s1 = Students(name='小明', age=18, qq='123456')

需要保存才可以操作数据库
>>>s1.save()

 

是否创建成功了呢,我们在MySQL中查看一下

复制代码
mysql> select * from teacher_students;
+----+--------+-----+-----+--------+-------+----------------------------+
| id | name   | age | sex | qq     | phone | c_time                     |
+----+--------+-----+-----+--------+-------+----------------------------+
|  1 | 小明   |  18 |   1 | 123456 |       | 2019-02-26 08:04:57.955584 |
+----+--------+-----+-----+--------+-------+----------------------------+
1 row in set (0.00 sec)

#这里创建的时间一定是UTC时间,因为项目会运行在不同的时区,取出来的时候再转换成当前时间就好了。
复制代码

当前查看的all方式返回的是函数体类型的,不好查看,需要在模型代码中添加

1 def __str__(self):
2     return '%s-%s' % (self.name, self.age)

再次查询的时候会变成格式化的样式

>>>Students.objects.all()
<QuerySet [<Students: 小明-18>]>
第二种方式,创建一条数据,一条一条插入数据
复制代码
>>>s2 = Students()

>>>s2.name = '小明'

>>>s2.age = 18

>>>s2.qq = '123456'
复制代码
第三种方式,创建一条数据,直接操作数据库
>>>Students.objects.create(name='小明', age=18, qq='123456')
<QuerySet: 小明-18>

#返回查询集

 

第四种方式,先查,查了再创建
>>>Students.objects.get_or_create(name='小明')
(<Students: 小明-18>, False)     

#没有创建成功,数据存在返回查到的值
第一个元素代表模型对象,bool值代表是否创建,False代表没有创建是查询的。

 


查询

all方法

返回的是一个查询集,不是对象,没有操作数据库,可以查看到SQL语句

>>>Students.objects.all()
<QuerySet [<Students: 小明-18>, <Students: XiaoHong-16>, <Students: 王五-24>, <Students: 赵柳-22>]>

#我们添加一些数据后,用于查询出来的结果

 

查看all语句的背后的操作,查看sql语句

>>>res = Students.objects.all()

>>>print(res.query)
SELECT `teacher_students`.`id`, `teacher_students`.`name`, `teacher_students`.`age`, `teacher_students`.`sex`, `teacher_students`.`qq`, `teacher_students`.`phone`, `teacher_students`.`c_time` FROM `teacher_students`

#就相当于SQL语句: SELECT * FROM 'teacher_students'

 

切片方式

>>>res = Students.objects.all()

>>>print(res[1:2].query)
SELECT `teacher_students`.`id`, `teacher_students`.`name`, `teacher_students`.`age`, `teacher_students`.`sex`, `teacher_students`.`qq`, `teacher_students`.`phone`, `teacher_students`.`c_time` FROM `teacher_students`  LIMIT 1 OFFSET 1

#通过切片的方式达到LIMIT的SQL语句

 

get方法

当我们的get匹配到多条数据的时候会报错。

>>>Students.objects.get(name='小明')
 <Students: 小明-18>

#如果给定的查询内容,可以匹配到多条数据,则会报错,get方法只能获取单挑且唯一的数据

 

pk:参数中pk代表主键

>>>Students.objects.get(pk=1)
<QuerySet [<Students: 小明-18>]>

#同样可以查询到,pk代表主键

 

filter方法
>>>res = Students.objects.filter(sex=1)

>>>print(res.query)
SELECT `teacher_students`.`id`, `teacher_students`.`name`, `teacher_students`.`age`, `teacher_students`.`sex`, `teacher_students`.`qq`, `teacher_students`.`phone`, `teacher_students`.`c_time` FROM `teacher_students` WHERE `teacher_students`.`sex` = 1

 


修改

get方法

通过对象赋值的方法修改

>>>s = Students.objects.get(name='小明')

>>>s.age = 16

>>>s.save()
updata方法

通过查询到的数据进行修改,可以修改多条数据

>>>Students.objects.filter(name='小明').update(age=19)
1
#返回修改的条数

 

删除

delete方法

指定删除,通过对象查到数据,再删除对象

>>>s = Students.objects.get(pk=2)

>>>s.delete()
(1, ('teacher.Students': 1))

#返回的是一个元祖:删除的数量,表的名称,删除数量

删除多条

>>>Students.objects.filter(sex=1).delete()
(3, ('teacher.Students': 3))

 


数据库应用到模型中

views中的配置

1 from teacher.models import Students
2 
3 def index(request):
4     students = Students.objects.all()

 

对应的html中配置

  1. 获取值的方式和字典的方式一样,不用再另外配置

原文地址https://www.cnblogs.com/hua888/p/10442702.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
241 77
|
18天前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
19天前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
3月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
404 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
6月前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
4月前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
6月前
|
人工智能 开发者 Python
Chainlit:一个开源的异步Python框架,快速构建生产级对话式 AI 应用
Chainlit 是一个开源的异步 Python 框架,帮助开发者在几分钟内构建可扩展的对话式 AI 或代理应用,支持多种工具和服务集成。
521 9
|
8月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
293 62
|
6月前
|
JSON 安全 中间件
Python Web 框架 FastAPI
FastAPI 是一个现代的 Python Web 框架,专为快速构建 API 和在线应用而设计。它凭借速度、简单性和开发人员友好的特性迅速走红。FastAPI 支持自动文档生成、类型提示、数据验证、异步操作和依赖注入等功能,极大提升了开发效率并减少了错误。安装简单,使用 pip 安装 FastAPI 和 uvicorn 即可开始开发。其优点包括高性能、自动数据验证和身份验证支持,但也存在学习曲线和社区资源相对较少的缺点。
317 15
|
6月前
|
人工智能 分布式计算 大数据
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
318 8

推荐镜像

更多