美文网首页
Django系列6-数据库操作

Django系列6-数据库操作

作者: 只是甲 | 来源:发表于2022-09-09 09:57 被阅读0次

一.Python 的数据库操作

我们经常使用Python来操作数据库,用的最多的就是pymysql这个库

  import pymysql
  
  # 1.连接MySQL
  conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd="root123", charset='utf8', db='unicom')
  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  
  # 2.发送指令
  cursor.execute("insert into admin(username,password,mobile) values('admin','123456','15155555555')")
  conn.commit()
  
  # 3.关闭
  cursor.close()
  conn.close()

二. Django中的数据库操作

Django开发操作数据库更简单,内部提供了ORM框架。


image.png

2.1 安装第三方模块

pip install mysqlclient

如果上面安装失败了,可以去下载对应的安装包来安装


image.png

2.2 ORM

ORM可以帮助我们做两件事:

  1. 创建、修改、删除数据库中的表(不用你写SQL语句)。 【无法创建数据库】
  2. 操作表中的数据(不用写SQL语句)。

2.2.1 创建自己的数据库

create database django_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
image.png

2.2.2 django连接数据库

在settings.py文件中进行配置和修改。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_test',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'abc123',
        'HOST': '127.0.0.1',  # 那台机器安装了MySQL
        'PORT': 3306,
    }
}
image.png

django连接数据库可以参考官方文档:
https://docs.djangoproject.com/zh-hans/3.2/ref/databases/

2.2.3 django操作表

  1. 创建表
  2. 修改表
  3. 删除表

2.2.3.1 创建表

在models.py文件中


image.png

在models.py中增加了一个class,django会自动解析为如下sql:

create table app01_userinfo(
    id bigint auto_increment primary key,
    name varchar(32),
    password varchar(64),
    age int
);

执行命令:

python manage.py makemigrations
python manage.py migrate

安装记录:

(mysite2) E:\python\Django\mysite2>pip install pymysql
Collecting pymysql
  Cache entry deserialization failed, entry ignored
  Using cached https://files.pythonhosted.org/packages/4f/52/a115fe175028b058df353c5a3d5290b71514a83f67078a6482cff24d6137/PyMySQL-1.0.2-py3-none-any.whl
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2
You are using pip version 10.0.1, however version 22.2.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

(mysite2) E:\python\Django\mysite2>
(mysite2) E:\python\Django\mysite2>
(mysite2) E:\python\Django\mysite2>python manage.py makemigrations
Migrations for 'app01':
  app01\migrations\0001_initial.py
    - Create model UserInfo

(mysite2) E:\python\Django\mysite2>python manage.py migrate
System check identified some issues:

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
        HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/3.2/ref/databases/#mysql-sql-mode
Operations to perform:
  Apply all migrations: admin, app01, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying app01.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

(mysite2) E:\python\Django\mysite2>

看看mysql数据库:

image.png

2.2.3.2 修改表

在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据


image.png

执行命令:

python manage.py makemigrations
python manage.py migrate
image.png

2.2.3.3 删除表

我们直接把class 删除掉,然后再来看效果

执行命令:

python manage.py makemigrations
python manage.py migrate
image.png

2.2.4 ORM操作表中的数据

models.py 文件

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=2)


class Department(models.Model):
    title = models.CharField(max_length=16)

执行命令:

python manage.py makemigrations
python manage.py migrate

url.py

# django orm
    path('orm/', views.orm),

views.py

from app01.models import *

def orm(request):

    #### 1.新建 ####
    Department.objects.create(title="销售部")
    Department.objects.create(title="IT部")
    Department.objects.create(title="运营部")
    UserInfo.objects.create(name="张三", password="123", age=19)
    UserInfo.objects.create(name="李四", password="666", age=29)
    UserInfo.objects.create(name="王五", password="666")

    #### 2.删除 ####
    UserInfo.objects.filter(id=3).delete()
    Department.objects.all().delete()

    #### 3.获取数据 ####
    #3.1 获取符合条件的所有数据
    #data_list = [对象,对象,对象]  QuerySet类型
    data_list = UserInfo.objects.all()
    for obj in data_list:
        print(obj.id, obj.name, obj.password, obj.age)

    #data_list = [对象,]
    data_list = UserInfo.objects.filter(id=1)
    print(data_list)
    #3.1 获取第一条数据【对象】
    row_obj = UserInfo.objects.filter(id=1).first()
    print(row_obj.name, row_obj.password, row_obj.age)

    #### 4.更新数据 ####
    UserInfo.objects.all().update(password=999)
    UserInfo.objects.filter(id=2).update(age=999)
    UserInfo.objects.filter(name="李四").update(age=999)

    return HttpResponse("成功")

访问页面:
访问指定页面就可以对数据库进行增删改查的操作了,那么也就可以通过页面的操作来操作数据库了,当然这个地方只是一个最简单的案例,后面会将具体的操作给补充上。

三. 用户管理实例

3.1 展示用户信息

  1. 新增URL


    image.png
  2. 新增views.py下面的函数
    这个步骤就是通过查询数据,将user_info下面的所有的数据都传入到前端html页面

def info_list(request):
    # 1.获取数据库中所有的用户信息
    # [对象,对象,对象]
    data_list = UserInfo.objects.all()

    # 2.渲染,返回给用户
    return render(request, "info_list.html", {"data_list": data_list})
  1. 新增html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>INFO列表</h1>

<a href="/info/add/">添加</a>>

<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>密码</th>
        <th>年龄</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for obj in data_list %}
        <tr>
            <td>{{ obj.id }}</td>
            <td>{{ obj.name }}</td>
            <td>{{ obj.password }}</td>
            <td>{{ obj.age }}</td>
            <td>
                <a href="/info/delete/?nid={{ obj.id }}">删除</a>
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>

</body>
</html>
  1. 访问页面
    添加和删除都只是增加了按钮,后面补充上对应的功能


    image.png

3.2 新增用户

上一步我们已经将按钮添加到用户列表页面了

  1. 新增url


    image.png
  2. views.py新增对应函数

def info_add(request):
    if request.method == "GET":
        return render(request, 'info_add.html')

    # 获取用户提交的数据
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    age = request.POST.get("age")

    # 添加到数据库
    UserInfo.objects.create(name=user, password=pwd, age=age)

    # 自动跳转
    # return redirect("http://127.0.0.1:8000/info/list/")
    return redirect("/info/list")
  1. 新增html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post">
    {% csrf_token %}
    <input type="text" name="user" placeholder="用户名">
    <input type="text" name="pwd" placeholder="密码">
    <input type="text" name="age" placeholder="年龄">
    <input type="submit" value="提交">
</form>>
</body>
</html>
  1. 访问页面


    image.png
    image.png

3.3 删除用户

用户列表页面已经做了删除的按钮,此时只需将对应的id传到后端,然后后端调用对应函数进行删除即可

  1. 新增url


    image.png
  2. views.py新增对应函数
    从访问的url中获取id值,然后进行删除

def info_delete(request):
    nid = request.GET.get('nid')
    UserInfo.objects.filter(id=nid).delete()
    return redirect("/info/list")
  1. 访问页面


    image.png
image.png

参考:

  1. https://www.bilibili.com/video/BV1NL41157ph

FAQ:

1. django连接不上mysql

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
解决方案:

pip install pymysql

然后django项目初始化的时候加上

import pymysql
pymysql.install_as_MySQLdb()
image.png

2. django删表重建的办法

  1. 先到数据库把表删掉:drop table

  2. 注释django中对应的Model

  3. 执行命令
    python manage.py makemigrations
    python manage.py migrate --fake

  4. 去掉django中对应的Model的注释

  5. 执行命令
    python manage.py makemigrations
    python manage.py migrate

相关文章

  • Django系列6-数据库操作

    一.Python 的数据库操作 我们经常使用Python来操作数据库,用的最多的就是pymysql这个库 二. D...

  • 如何查看Django ORM执行的SQL语句

    Django ORM对数据库操作的封装相当完善,日常大部分数据库操作都可以通过ORM实现。但django将查询过程...

  • Django模型类的属性与关系

    在django中, 所有的数据库操作都是面向对象编程,基本上看不到操作数据库的sql语句,方便快捷是django开...

  • 数据模型操作(1)

    Django操作数据库 -----数据模型MVT:model数据模型部分 1. Django 连接数据库 修改项目...

  • Django:04.ORM操作

    一、Django连接数据库操作 1、创建数据库 (注意设置 数据的字符编码)由于Django自带的orm是data...

  • django

    django django同步表结构建表修改表数据库操作增删改查 同步表结构 所有操作需要在项目manage.py...

  • Django事务操作

    在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的...

  • Django连接MySQL数据库

    1.1.Django项目连接mysql数据库 Django项目要操作数据库,首先要和数据库建立连接,才能让程序中的...

  • Django数据存储到数据库(建表)

    Django中要将数据库存储到数据库中,步骤如下环境:python3+Django2.0 操作过程 1.在sett...

  • django 工程创建

    创建Django工程 创建APP 数据库操作 运行Django 配置settings.py 模板路径 静态文件st...

网友评论

      本文标题:Django系列6-数据库操作

      本文链接:https://www.haomeiwen.com/subject/cyunwrtx.html