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\try_for_orm\venv\lib\site-packages\django\db\backends\mysql\base.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\try_for_orm\venv\lib\site-packages\django\db\backends\mysql\base.py
对其36行内容进行修改:
方法就是将这部分内容注释掉,就不会再监测你的版本问题了
这是解决问题的第一步,但是随后又会发生如下报错:
File "C:\Users\try_for_orm\venv\lib\site-packages\django\db\backends\mysql\operations.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语句,显示在后台命令台。
今天的任务总的来说是顺利完成了