【玩转全栈】----Django连接MySQL

阅前先赞,养好习惯!

目录

1、ORM框架介绍

选择建议

2、安装mysqlclient

3、创建数据库

4、修改settings,连接数据库

5、对数据库进行操作

创建表

删除表

添加数据

删除数据

修改(更新)数据:

获取数据


1、ORM框架介绍

之前讲过MySQL连接pymysql,PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,用于直接与 MySQL 数据库交互。通过 PyMySQL,可以发送原生 SQL 查询语句,并获取查询结果。但是大家也能看到,PyMySQL的一些语句其实和MySQL是差不多的,并且代码比较繁琐,切换数据库也很麻烦,要修改大量代码。

现在来介绍另一种方法:ORM

Django 的 ORM(Object-Relational Mapping)是一种将数据库表和 Python 类关联起来的工具,允许开发者通过操作 Python 对象来与数据库交互,而不需要直接编写 SQL 查询。

两者区别:

特性 Django ORM PyMySQL
开发效率 高:无需手写 SQL,直接用 Python 操作数据库。 低:需要手写 SQL,代码量多,容易出错。
代码可读性 高:简洁、结构化,贴近业务逻辑。 中:需要理解 SQL 和 Python 代码的混合逻辑。
数据库独立性 强:支持多种数据库(MySQL、PostgreSQL、SQLite 等),切换数据库只需更改配置,无需改动代码。 弱:依赖 MySQL,切换数据库需要修改大量 SQL。
学习成本 低:只需学习 Django 的模型和查询 API。 高:需要熟悉 SQL 语法和数据库操作。
性能 中:抽象层带来开销,复杂查询可能性能较低。 高:直接发送 SQL,性能更高。
功能扩展 高:内置丰富功能,如分页、外键、查询优化等。 低:需要自己实现复杂功能。
错误处理 自动处理,减少手动处理的错误风险。 完全依赖开发者,错误处理工作量大。

选择建议

  • 使用 Django ORM

    • 开发 Django 项目时,优先选择 ORM。它能大幅提升开发效率,特别是对于中小型项目。
    • 如果项目大部分操作是增删改查,ORM 是首选。
  • 使用 PyMySQL

    • 如果需要处理复杂的 SQL 查询或高性能场景,可以结合 PyMySQL 使用。例如,在 Django 项目中,使用 ORM 完成大部分逻辑,少数复杂场景下直接用 PyMySQL 或 raw SQL 查询。
    • 非 Django 项目,且对性能要求极高时,选择 PyMySQL。

ORM是一个框架,可以通过PyMySQL工具来操作MySQL,而在Django开发中,一般使用mysqlclient工具而并非PySQL,有两个原因,一个是Django 官方文档中明确推荐使用 mysqlclient ,因为它和 Django 的 ORM 紧密集成,兼容性经过了长期验证;还有就是**mysqlclient的性能要好一点。**

Orm将数据库基本语句弄得更简单,将简单的语句翻译成数据库原生代码。

2、安装mysqlclient

打开控制台输入:

pip install mysqlclient

安装成功界面:

3、创建数据库

由于mysqlclient无法创建数据库,所以得我们自己创建,详细教程前文有说:

【全栈开发】----Mysql基本配置与使用-CSDN博客

进入到mysql>下,输入:

create database mydata default character set utf8;

并检查mydata是否已被创建

show databases;

4、修改settings,连接数据库

打开settings文件,这里是默认的连接sqlite3,这也是一种数据库,我们要改成MySQL的,先把这段代码注释。

输入:

python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  #django连接mysql,还可以连oracle、sqlite3、postgresql等等
        'NAME': 'mydata',  #数据库名字
        'USER':'root',  #用户
        'PASSWORD':'612612',  #密码
        'HOST':'127.0.0.1',  #主机
        'PORT':'3306',  #端口
    }
}

注意!大家的数据库名称和密码可能与我不一样,修改一下即可

5、对数据库进行操作

创建表

在app的models文件中,每新建一个类,就是创建一张表,类需继承models类

python 复制代码
class Department(models.Model):
    title = models.CharField(max_length=32)

例如上面的Department类就是创建了一张表,表中有title行,32位字符型

python 复制代码
class UserInfo(models.Model):  #继承models类
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()

UserInfo类定义了一个长度为32的字符串行name,长度为64的字符串行password,有符号情况下最多十位的整型age行。

复制代码
类名代替表名,字段名代表列名

上面的UserInfo类其实就相当于MySQL中的:

python 复制代码
create table app01_userinfo(
    id bigint auto_increment primary key,
    name varchar(32),
    password varchar(64),
    age int,
)

运行命令如下:

python 复制代码
python manage.py makemigrations
python manage.py migrate

在Pycharm终端依次输入运行即可

注意前提是下载了mysqlclient库,并且app已注册

检查表是否创建成功:

python 复制代码
desc app01_userinfo;

**注意!!!**虽然我们在models中创建的是UserInfo类,但mysqlclient处理后真正的表名是

应用名+_+类(类全小写)

所以此处表名是 app01_userinfo

创建表后还能再添加字段吗?当然是可以的

在类中再添加一个字段,输入:

python 复制代码
size = models.IntegerField()

运行后提示:

1、要是选择1的话,点击Enter,会提示让您输入一个默认值,然后那一列都将是那个默认值。

2、要是选2的话,并且没有任何操作,数据库中将不会显示新加的数据。

3、选2后,在源代码中添加默认值,将会出现数据。

python 复制代码
size = models.IntegerField(default=2)

也可以将数据设置成空:

python 复制代码
size = models.IntegerField(null=True,blank=True)

删除表

删除表很简单,只需要将类注释或者直接删掉,再输入这两行命令刷新即可

python 复制代码
python manage.py makemigrations
python manage.py migrate

添加数据

新建一个url,用来测试是否添加数据

python 复制代码
def orm(requests):
    # 测试orm操作表中的数据
    
    return HttpResponse("成功")

增加数据命令:

python 复制代码
UserInfo.objects.create(name="谭谈",password="1234",age=18)

启动项目,发现数据确实是添加进去了

大家可以自己再多添加几行数据,便于后面的修改与删除

删除数据

删除满足特定条件的数据:

python 复制代码
Department.objects.filter(id=2).delete()

确实是删除了

删除全部数据:

这就不演示了,大家可以自己玩玩

python 复制代码
UserInfo.objects.all().delete()

修改(更新)数据:

python 复制代码
UserInfo.objects.filter(id=1).update(name="有的兄弟")

确实是修改了

获取数据

使用.all()方法获取数据

python 复制代码
data_list = UserInfo.objects.all()
print(data_list)

可以先在控制台打印看看

发现拿到的是一个QuerySet对象,包含三个数据,每个数据后面的数字代表ID值

可以通过迭代器和点属性来获取具体的值:

python 复制代码
    for data in data_list:
        print(data.id,data.name,data.password,id.age)

发现确实是被正确获取并打印了:

获取到的QuerySet可以通过索引和其他方法取值,常见的有以下三种,我就不一一介绍了,大家可以自己玩玩:

.first() vs .get() vs [0]

方法 返回值 异常处理 使用场景
.first() 第一条记录或 None 不抛出异常 不确定是否有数据时更安全
.get() 符合条件的唯一对象 抛出 DoesNotExist 异常 确定条件只会返回一条数据时使用
[0] 第一条记录或抛出 IndexError 抛出 IndexError 异常 确定有数据且只需第一条时使用

本次分享就到这儿了

下一篇博客更新用户管理综合案例!!!

感谢您的三连!!!

相关推荐
yuanbenshidiaos17 分钟前
MYSQL--------事务控制和锁定语句
数据库·mysql
斗-匕17 分钟前
MySQL执行计划分析
数据库·mysql
蜗牛_snail36 分钟前
学习笔记 : MySQL进阶篇一之架构和日志文件
笔记·学习·mysql
花菜会噎住1 小时前
Python 模块,包(详解)
开发语言·python
bin91531 小时前
正则表达式{}和(),pyhton里的正则表达式,函数findall解析
python·正则表达式·findall
reasonsummer1 小时前
【办公类-88-02】20250106批量读后感
python·vba
测试19981 小时前
性能测试工具的原理与架构解析
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
m0_748240022 小时前
【MySQL】数据库-图书管理系统(CC++实现)
c语言·数据库·mysql
Pocker_Spades_A2 小时前
通义灵码在跨领域应用拓展之物联网篇
python·物联网·阿里云·pycharm·云计算
cuckooman2 小时前
Ubuntu无法创建python venv环境
linux·python·ubuntu