Python学习第128天(环境配置、orm增删改)

今天白天用了大概四个小时,逐个解决了我在Django开发中遇到的各种傻逼问题,今天分为两个部分,首先是说一下解决问题的过程,记录下来方便下次使用,每个项目都需要单独进行修改,同时把今天的练手作业分析一下。

一、环境变量问题的解决:

  (一)数据库的时区设置,我找到问题原因的时候也是惊呆了,报错内容为:Server returns invalid timezone. Go to Advanced tab and setserverTimezone

  出现的位置,在我们需要添加database表格方便查看时出现

  

   解决方法,在dos命令环境内进行如下操作:

    1、输入:set global time_zone = '+8:00'; 

    2、继续输入 show variables like'%time_zone'; 

  显示如下图形:

    

  (二)pymysql版本过低问题报错,虽然确实版本低,但是真的是没法更新,所以还是将修改方法记录一下;

    首先报错发生在你完成models文件class创建后,输入python manage.py makemigrations的时候

    报错内容为:    

  File "C:Users	ry_for_ormvenvlibsite-packagesdjangodbackendsmysqlase.py", line 36, in <module>
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

    此时我们需要找到文件C:Users ry_for_ormvenvlibsite-packagesdjangodbackendsmysqlase.py

    对其36行内容进行修改:

    

     方法就是将这部分内容注释掉,就不会再监测你的版本问题了

    这是解决问题的第一步,但是随后又会发生如下报错:

  File "C:Users	ry_for_ormvenvlibsite-packagesdjangodbackendsmysqloperations.py", line 146, in last_executed_query
    query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'

    大致意思就是此处的 str 没有 decode 的属性,点击进入 所以我们找到operations.py 文件,把 decode 改为 encode 即可

    

   然后就可以顺利的建立:

    

 顺着了这个问题的解决,总结一下最终实现导入pymysql的方法

  最终我们实现了models中的类与mysql数据库连接,这样,我们就可以顺利建立了,大致过程如下:

  1.app包下的models.py文件内class 名称(models.Model):完成基本内容的创建

  2.Django项目下的__init__.py文件输入:

    import pymysql

    pymysql.install_as_MySQLdb()

    这里导入pymysql的方法就是pip  install  pymysq即可搞定,版本问题参考问题(一)的解决

  3.输入python manage.py  makemigrations

  4.输入python manage.py migrate

  5.输入python manage.py runserver 127.0.0.1:8080

这里我的DATABASES内容如下:  

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'first_for_me',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123456', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }
}

    完成上述五步之后,dos中mysql效果如下:

    

   (三)Django中的mysql表格插件导入的说明,就是下面这个东西:

  

   需要对填写内容说明一下,不然总是填写错误

  

二、Django中ORM的增删改问题(单表操作)

Django项目url文件:  

from django.contrib import admin
from django.urls import path
from app_1 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
    path('addbook/',views.addbook),
    path('update/',views.update),
    path('delete/',views.delete)
]

app下的views文件:  

from django.shortcuts import render,HttpResponse
from app_1.models import *

def index(req):
    return render(req,'index.html')

def addbook(req):

    #增加内容方式1:
    # b = Book(name='python基础', price=99,author='xiaoyao',pub_date='2017-12-12')
    # b.save()

    #增加方式2:
    Book.objects.create(name='红楼梦linux', price=88,author='曹雪芹',pub_date='1766-12-12')
    return HttpResponse('ok')
    #类别到可以使用通过GET获得的字典直接添加,客户在后台输入信息后直接添加
    #Book.objects.create(**div)

def update(req):# 无论是修改还是删除,都是建立在查找的基础上进行的
    #修改方式1:
    Book.objects.filter(author='xiaoyao',).update(price=999)
    #这里需要注意Book.objects.filter(author='xiaoyao',)最后面的这个逗号,没有后面就会报错

    #修改方式2:
    b = Book.objects.get(author='xiaoyao')
    #这个b的数据类型是django.db.models.quer.QuerySet
    # 是一个Django特定的数据类型,筛选出来是一组数据集合,可以进行切片,有点类似列表
    b.price = 120
    b.save()
    return HttpResponse('更新成功!')

def delete(req):
    #删除方法:
    Book.objects.filter(author='yy').delete()

    return HttpResponse('删除成功!')

app下的models文件:

from django.db import models

class Book(models.Model):
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    pub_date = models.DateField()
    author = models.CharField(max_length=32)

class Author(models.Model):
    name = models.CharField(max_length=32)

templates包下的index.html文件:

!DOCTYPE html>
<html lang="en">
<head>
    <script src="jquery-3.1.1.js"></script>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0
        }
        .head{
            line-height: 40px;
            background-color: green;
            color: white;
            text-align: center;
        }
    </style>
</head>
<body>
<div class="outer">
    <div class="head">标题</div>
    <div class="content">
        <a href="/addbook/">添加书籍</a>
        <a href="/update/">修改书籍</a>
        <a href="/delete/">删除书籍</a>
        <a href="/select/">查询书籍</a>
    </div>
    <hr>
    <div class="queryResult">
         {% for book in book_list %}
         <div>
              <p>{{ book.name }} {{ book.author }} {{ book.price }}</p>
         </div>
         {% endfor %}
    </div>
</div>
</body>
</html>

最终实现的效果就是,我们在前端通过Django项目,完成了对后台数据库的操作

  效果1:    

  效果2,实际上就是通过dos命令打开数据库,对其内容进行查找显示:

 算是实现了连接效果

最后说一下一个备用问题,我们在使用ORM对数据库mysql进行操作的时候,还是应该看一下ORM是如何翻译我们的语句成为mysql所能识别的内容,可以在Django项目下的settings文件下增加:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

日志文件,用于记录你在使用ORM语言时,对应的每个mysql语句,显示在后台命令台。

今天的任务总的来说是顺利完成了

原文地址:https://www.cnblogs.com/xiaoyaotx/p/13286060.html