zoukankan      html  css  js  c++  java
  • django+mysql的使用

    Django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。方便的是,django可以自动生成这些create table, alter table, drop table的操作。其次Django为咱们也提供了后台管理模块(Django-Admin),主要功能是通过后台管理来实现客户端的功能,可以对数据进行增删改查。也可以通过该功能进行二次开发

    Django中的mysql配置

    在上期内容,我们了解了settings.py配置信息的内容,其中DATABASES是用来管理数据库配置的,默认是sqlite3数据库,所以我们需要将其修改成mysql数据库。

    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases

    # 数据库配置 默认的数据库为sqlite
    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', # 数据库引擎
            'NAME': 'django_mysql', # 数据库名
            'USER': 'root', # 账号
            'PASSWORD': 'root', # 密码
            'HOST': '127.0.0.1', # HOST
            'POST': 3306, # 端口

        }
    }

    字段名称代码中都添加了相应说明,ENGINE为MYSQL数据库引擎,这个当然不会凭空出现,需要我们去安装

    安装pymysql
    pip3 install pymysql

    项目中配置

    在最开始的项目包下的init.py中进行如下配置

    """
    setting中的配置默认为sqlite3数据库 当需要修改成MySql时
    并且在setting.py的同级目录的__init__.py 加入如下配置
    否则会报错: Error loading MySQLdb module.
    """
    import pymysql
    pymysql.install_as_MySQLdb()

    如果mysql配置信息错误(用户名、密码、host等)控制台会报如下异常

    pymysql.err.OperationalError: (1045, "Access denied for user 'ROOT'@'localhost' (using password: YES)")

    在app文件的models.py文件中 创建Student(学生信息)和StudentUnion(社团信息)

    models.py:数据模块,用于数据库设计

    """
    创建学生信息表模型
    """
    from django.db import models

    """
     该类是用来生成数据库的 必须要继承models.Model
    """
    class Student(models.Model):
        """
        创建如下几个表的字段
        """
        # 学号 primary_key=True: 该字段为主键
        studentNum = models.CharField('学号', primary_key=True, max_length=15)
        # 姓名 字符串 最大长度20
        name = models.CharField('姓名', max_length=20)
        # 年龄 整数 null=False, 表示该字段不能为空
        age = models.IntegerField('年龄', null=False)
        # 性别 布尔类型 默认True: 男生 False:女生
        sex = models.BooleanField('性别', default=True)
        # 手机 unique=True 该字段唯一
        mobile = models.CharField('手机', unique=True, max_length=15)
        # 创建时间 auto_now_add:只有在新增的时候才会生效
        createTime = models.DateTimeField(auto_now_add=True)
        # 修改时间 auto_now: 添加和修改都会改变时间
        modifyTime = models.DateTimeField(auto_now=True)

        # 指定表名 不指定默认APP名字——类名(app_demo_Student)
        class Meta:
            db_table = 'student'


    """
    学生社团信息表
    """
    class studentUnion(models.Model):
        # 自增主键, 这里不能设置default属性,负责执行save的时候就不会新增而是修改元素
        id = models.IntegerField(primary_key=True)
        # 社团名称
        unionName = models.CharField('社团名称', max_length=20)
        # 社团人数
        unionNum = models.IntegerField('人数', default=0)
        # 社团负责人 关联Student的主键 即studentNum学号 一对一的关系,on__delete 属性在django2.0之后为必填属性后面会介绍
        unionRoot = models.OneToOneField(Student, on_delete=None)

        class Meta:
            db_table = 'student_union'


    """
    OneToOneField: 一对一
    ForeignKey: 一对多
    ManyToManyField: 多对多(没有ondelete 属性)
    """

    在利用models.py文件生成数据库表之前,我们需要手动的先创建数据库:

    mysql> create database django_mysql;
    Query OK, 1 row affected (0.01 sec)

    创建完django_msql库之后,我们在终端执行如下命令,他的作用是将models文件生成一个迁移文件

    python3 manage.py makemigrations

    在这里插入图片描述在这里插入图片描述
    迁移文件生成完毕,执行

    python3 manage.py migrate

    会将迁移文件的内容作用到数据库中,生成表或者修改字段属性

    控制台输出如下,则表示执行成功

    (django_venv) xxxxxdeAir:djangoDemo xxxxx$ python3 manage.py migrate
    Operations to perform:
      Apply all migrations: admin, app_demo, 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 app_demo.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 sessions.0001_initial... OK

    查看我们的django_mysql数据库,其中student和student_union就是用models文件生成的表,其他的表是项目自动生成的,暂时可以先不用管

    mysql> use django_mysql
    Database changed

    mysql> show tables;
    +----------------------------+
    | Tables_in_django_mysql     |
    +----------------------------+
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    | student                    |
    | student_union              |
    +----------------------------+
    12 rows in set (0.00 sec)
    表结构

    desc查看表结构

    mysql> desc student;
    +------------+-------------+------+-----+---------+-------+
    | Field      | Type        | Null | Key | Default | Extra |
    +------------+-------------+------+-----+---------+-------+
    | studentNum | varchar(15) | NO   | PRI | NULL    |       |
    | name       | varchar(20) | NO   |     | NULL    |       |
    | age        | int(11)     | NO   |     | NULL    |       |
    | sex        | tinyint(1)  | NO   |     | NULL    |       |
    | mobile     | varchar(15) | NO   | UNI | NULL    |       |
    | createTime | datetime(6) | NO   |     | NULL    |       |
    | modifyTime | datetime(6) | NO   |     | NULL    |       |
    +------------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)
    mysql> desc student_union;
    +--------------+-------------+------+-----+---------+-------+
    | Field        | Type        | Null | Key | Default | Extra |
    +--------------+-------------+------+-----+---------+-------+
    | id           | int(11)     | NO   | PRI | NULL    |       |
    | unionName    | varchar(20) | NO   |     | NULL    |       |
    | unionNum     | int(11)     | NO   |     | NULL    |       |
    | unionRoot_id | varchar(15) | NO   | UNI | NULL    |       |
    +--------------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    至此Django利用models文件创建数据库表的功能已经完毕。接下来用代码的方式演示一下Django如何进行增删改查

    增加数据

    为了提供一些测试数据,这里用for循环批量的加了几条简单的数据。

    from app_demo.models import Student
    import random
    """
    插入测试数据
    """
    def insert(request):
        # 随机整数 作为学号
        for i in range(0, 5):
            studentNum = int(random.uniform(0, 1) * 10000000000)
            # 从models文件中获取student对象
            student = Student()
            # 给对象赋值
            student.studentNum = studentNum
            student.name = 'tom' + str(i)
            student.age = 15
            student.sex = random.choice([True, False])
            student.mobile = int(random.uniform(0, 1) * 10000000000)
            # 插入数据
            student.save()

        return HttpResponse('数据插入完毕')

    urls.py 文件中 urlpatterns中配置

    url(r'^insert/', views.insert)

    浏览器中访问http://localhost:8000/insert/ 浏览器显示‘数据插入完毕’

    查询数据库,发现有5天数据,也就是插入成功

    mysql> select * from student;
    +------------+------+-----+-----+------------+----------------------------+----------------------------+
    | studentNum | name | age | sex | mobile     | createTime                 | modifyTime                 |
    +------------+------+-----+-----+------------+----------------------------+----------------------------+
    | 1352687635 | tom2 |  15 |   | 941807449  | 2018-11-08 09:58:40.226856 | 2018-11-08 09:58:40.227002 |
    | 5554311867 | tom|  15 |   | 1598619027 | 2018-11-08 09:58:40.203807 | 2018-11-08 09:58:40.203960 |
    | 7302510986 | tom4 |  15 |   | 9602601619 | 2018-11-08 09:58:40.251479 | 2018-11-08 09:58:40.251682 |
    | 847849420  | tom3 |  15 |   | 195276039  | 2018-11-08 09:58:40.238601 | 2018-11-08 09:58:40.238928 |
    | 9962892430 | tom1 |  15 |   | 3265013828 | 2018-11-08 09:58:40.215488 | 2018-11-08 09:58:40.216106 |
    +------------+------+-----+-----+------------+----------------------------+----------------------------+
    5 rows in set (0.00 sec)

    查询数据

    """
    查询
    """
    def find(request):
        #sql = 'select * from student'
        # django 也可以执行原生的sql语句
        #result = Student.objects.raw(sql)

        # 查询name = tom1的数据
        result = Student.objects.filter(name='tom1')
        """
        result为<class 'django.db.models.query.QuerySet'>的对象
        需要进行数据处理
        """
        arr = []
        for i in result:
            content = {'学号': i.studentNum, '姓名': i.name, '性别': i.sex}
            arr.append(content)
        print(arr)
        print(type(arr))
        return HttpResponse(arr)

    配置urls,浏览器访问localhost:8000/find/

    在这里插入图片描述在这里插入图片描述

    修改数据

    """
    修改
    """
    def modify(request, studentNum):
        # 通过学号获取student对象
        student = Student.objects.get(studentNum=studentNum)
        # 设置student的name为jack
        student.name = 'jack'
        student.save()
        return HttpResponse('修改成功.')

    setting文件中的配置如下

    url(r'^modify/(?P<studentNum>d+)', views.modify),

    修改学号847849420的name为jack

    在这里插入图片描述在这里插入图片描述
    再次查询mysql数据库,发现name已经被更新成了jack

    mysql> select * from student where studentNum='847849420';
    +------------+------+-----+-----+-----------+----------------------------+----------------------------+
    | studentNum | name | age | sex | mobile    | createTime                 | modifyTime                 |
    +------------+------+-----+-----+-----------+----------------------------+----------------------------+
    | 847849420  | jack |  15 |   | 195276039 | 2018-11-08 09:58:40.238601 | 2018-11-08 10:22:46.403147 |
    +------------+------+-----+-----+-----------+----------------------------+----------------------------+
    1 row in set (0.00 sec)

    删除数据

    """
    删除
    """
    def delete(request, studentNum):
        student = Student.objects.get(studentNum=studentNum)
        student.delete()
        return HttpResponse('删除成功.')

    settings.py中urlpatterns的配置如下

    url(r'^delete/(?P<studentNum>.+)', views.delete)

    .+ 表示匹配多个字符(不包括换行等字符)

    浏览器请求该视图

    在这里插入图片描述在这里插入图片描述
    查询数据库,发现该数据已经被删除

    mysql> select * from student where studentNum='847849420';
    Empty set (0.01 sec)

    关注公众号「程序员共成长」(id: finishbug)。给新加入的小伙伴准备了丰厚的见面礼,包括但不限于:Python、Java、Linux、大数据、人工智能、前端等21个技术方向,后台回复"礼包"即可领取。

  • 相关阅读:
    了解语言学习的四个阶段,孩子的英语学习更从容
    MySQL 修改字段类型或长度
    js中退出语句break,continue和return 比较
    PHP中unset,array_splice删除数组中元素的区别
    php判断一个数组是另一个数组的子集
    PHP实现一维数组转二维数组的方法
    基于 HTML5 WebGL 的 3D 网络拓扑图
    SQL 2008下载地址以及全新安装详细过程
    php从数组中取出一段 之 array_slice
    Linux命令:cp (copy)复制文件或目录
  • 原文地址:https://www.cnblogs.com/wyl-0120/p/10005289.html
Copyright © 2011-2022 走看看