目录

一、Python操作MySQL基础

二、Django配置MySQL数据库连接

1、默认配置

2、 配置MySQL连接步骤

三、模型定义与数据库迁移

1. 创建用户模型

2. 数据库迁移

四、Django Shell操作数据库

1. 添加数据

2. 查询数据

3. 更新数据

4. 删除数据

五、多表关联操作

1. 模型定义

2. 关联操作

六、高级查询技巧

1. 聚合查询

2. Q对象复杂查询

七、常见问题与解决方案

八、总结


一、Python操作MySQL基础

在Python中,我们可以使用pymysql模块直接操作MySQL数据库:

首先在python终端(alt+f12)中下载pymysql,

pip install pymysql

二、Django配置MySQL数据库连接

1.默认配置

Django默认使用SQLite数据库,但实际项目中更常使用MySQL。

2. 配置MySQL连接步骤

        1.安装pymysql驱动

pip install pymysql

        2.修改settings.py配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_qiku',        # 数据库名称
        'USER': 'root',          # 数据库用户名
        'PASSWORD': '123456',    # 数据库密码
        'HOST': '127.0.0.1',     # 数据库主机
        'PORT': 3306,            # 数据库端口
        'OPTIONS': {
            'charset': 'utf8mb4',  # 建议设置字符集
        }
    }
}

 

        3.添加pymysql兼容层
在项目__init__.py文件中添加:

import pymysql
pymysql.install_as_MySQLdb()

注意: 是有settings.py的项目中__init__.py,不要弄成其它文件的__init__

注意:对于Python 3.x,需要此步骤来替代MySQLdb

三、模型定义与数据库迁移

1. 创建用户模型

from django.db import models

class User(models.Model):
    """
    用户模型类 --> 对应数据库表 tb_user
    """
    username = models.CharField(max_length=20, null=False, verbose_name="用户名")
    password = models.CharField(max_length=20, null=False, verbose_name="密码")
    gender = models.IntegerField(null=True, default=0, verbose_name="性别")
    age = models.IntegerField(null=True, verbose_name="年龄")
    phone = models.CharField(max_length=20, null=True, verbose_name="电话")
    email = models.EmailField(max_length=32, null=True, verbose_name="邮箱")

    class Meta:
        db_table = "tb_user"  # 自定义表名
        verbose_name = "用户"  # 在admin界面显示的名称
        verbose_name_plural = verbose_name  # 复数形式
        
    def __str__(self):
        return self.username  # 对象显示为用户名

2. 数据库迁移

        1、生成迁移文件

python manage.py makemigrations

        2、执行迁移

python manage.py migrate

提示:每次修改模型后都需要重新执行迁移操作

四、Django Shell操作数据库

启动Django Shell:

python manage.py shell

1. 添加数据

from book.models import User

# 方法1:创建对象后逐个赋值
user = User()
user.username = "admin"
user.password = "123456"
user.gender = 1
user.age = 20
user.phone = "111111111111"
user.email = "admin@qq.com"
user.save()

# 方法2:使用create方法
User.objects.create(
    username="guest",
    password="123456",
    gender=0,
    age=25,
    phone="22222222222",
    email="guest@qq.com"
)

2. 查询数据

# 查询所有记录
all_users = User.objects.all()

# 查询单条记录(不存在或有多条时会抛出异常)
user = User.objects.get(pk=1)  # 主键查询
user = User.objects.get(id=1)  # ID查询
user = User.objects.get(username='admin')  # 条件查询

# 使用filter查询(返回QuerySet)
users = User.objects.filter(username='admin')
users = User.objects.filter(age__gt=18)  # 年龄大于18
users = User.objects.filter(username__contains='ad')  # 模糊查询 like '%ad%'
users = User.objects.filter(username__startswith='ad')  # 以ad开头
users = User.objects.filter(username__endswith='min')  # 以min结尾

# 排序
users = User.objects.all().order_by('-age')  # 按年龄降序

3. 更新数据

user = User.objects.get(pk=1)
user.username = 'administrator'
user.save()

# 批量更新
User.objects.filter(age__lt=18).update(gender=0)

4. 删除数据

# 先查询再删除
user = User.objects.get(pk=2)
user.delete()

# 批量删除
User.objects.filter(age__gt=100).delete()

五、多表关联操作

1. 模型定义

class BookInfo(models.Model):
    """
    图书信息表 tb_book
    """
    bookName = models.CharField(max_length=20, null=False, verbose_name="图书名称")
    author = models.CharField(max_length=20, null=False, verbose_name="作者")
    price = models.FloatField(null=True, verbose_name="价格")
    publishDate = models.DateTimeField(null=True, verbose_name="出版日期")
    remark = models.CharField(max_length=512, verbose_name="备注")

    class Meta:
        db_table = "tb_book"
        
    def __str__(self):
        return self.bookName

class HeroInfo(models.Model):
    """
    英雄信息表 tb_hero
    """
    name = models.CharField(max_length=20, null=False, verbose_name="英雄名字")
    gender = models.IntegerField(default=0, null=True, verbose_name="性别")
    bookInfo = models.ForeignKey("BookInfo", on_delete=models.CASCADE, verbose_name="所属图书")
    remark = models.CharField(max_length=512, null=True, verbose_name="备注")

    class Meta:
        db_table = "tb_hero"
        
    def __str__(self):
        return self.name

2. 关联操作

# 创建图书
book = BookInfo.objects.create(
    bookName="射雕英雄传",
    author="金庸",
    price=45.8,
    publishDate="1980-01-01"
)

# 创建关联英雄 - 方法1
hr = HeroInfo()
hr.name = '黄蓉'
hr.gender = 1
hr.bookInfo = book
hr.save()

# 创建关联英雄 - 方法2
HeroInfo.objects.create(
    name="郭靖",
    gender=0,
    bookInfo=book
)

# 创建关联英雄 - 方法3(通过主表对象创建)
book.heroinfo_set.create(name='郭芙', gender=1)

# 查询图书的所有英雄
book = BookInfo.objects.get(pk=1)
heroes = book.heroinfo_set.all()  # 获取所有关联英雄

# 查询英雄所属图书
hero = HeroInfo.objects.get(name='黄蓉')
related_book = hero.bookInfo  # 获取关联的图书对象

六、高级查询技巧

1. 聚合查询

from django.db.models import Count, Avg, Max, Min, Sum

# 统计英雄数量
HeroInfo.objects.aggregate(total=Count('id'))

# 按性别分组统计
HeroInfo.objects.values('gender').annotate(count=Count('id'))

# 计算平均价格
BookInfo.objects.aggregate(avg_price=Avg('price'))

2. Q对象复杂查询

from django.db.models import Q

# 或条件查询
User.objects.filter(Q(age__gt=30) | Q(gender=1))

# 且条件查询
User.objects.filter(Q(username__contains='a') & Q(age__lt=40))

# 非条件查询
User.objects.filter(~Q(gender=1))

七、常见问题与解决方案

  1. 连接MySQL报错

    • 确保MySQL服务已启动

    • 检查数据库用户权限

    • 确认数据库已创建

  2. 迁移失败

    • 删除所有迁移文件(migrations目录下除__init__.py外的文件)

    • 删除数据库中的django_migrations表记录

    • 重新执行迁移

  3. 性能优化

    • 使用select_relatedprefetch_related减少查询次数

    • 只查询需要的字段(使用onlydefer

    • 批量操作使用bulk_createbulk_update

八、总结

本文详细介绍了Django中MySQL数据库的配置、模型定义、数据迁移以及通过ORM进行CRUD操作的方法。重点讲解了单表操作和多表关联操作,并提供了多种查询方式和高级技巧。掌握这些知识后,你将能够高效地在Django项目中操作数据库,构建复杂的数据关系模型。

建议在实际开发中结合Django Admin后台管理系统,可以更直观地管理和操作数据库数据。同时,对于复杂的查询需求,可以结合原生SQL和ORM混合使用,以达到最佳的性能和开发效率平衡。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐