Django将数据迁移至mysql数据库

配置settings文件

我们此前使用的数据库是sqlite3,现在我们切换至mysql数据库
方法如下:

打开项目的settings.py文件,找到databases数据库
我们将其ENGINE和NAME行注释掉(不要删,我们是做增量)

因为目前我们数据库中没有HelloDjango这个库,所以我们先要手动连接上去建立数据库。
打开终端:按以下步骤:(看不懂的补mysql如何登录并且建立数据库嗷)
注意字符编码set names utf8;一定要输入,否则会出现不支持中文出现乱码。

(venv) Z:\hellodjango>mysql -uroot -p
Enter password: **********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database HelloDjango;
Query OK, 1 row affected (0.38 sec)

mysql> use HelloDjango;
Database changed
mysql> set names utf8;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> exit
Bye

Pycharm连接mysql


接着我们
image.png
点击Test Connection
image.png
若出现这个爆红说明mysql时区
时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时。
所以要修改mysql的时长
在mysql的命令模式下,输入:
set global time_zone='+8:00';
之后我们再次尝试就成功了

将数据迁移进mqsql

我们成功打开之后发现里面没有数据,需要迁移数据
image.png
输入:python manage.py migrate来迁移
但是会发生如下报错:


是因为我们缺少驱动的问题
python连接mysql驱动大约有3种

  1. mysqlclient   

好处py2,py3都能兼容,直接使用,但是致命缺点对mysql安装有要求,必须指定位置存在配置文件,所以标准安装muysql时使用这个

  1.  python-mysql

python2支持很好
python3不支持

  1. pymysql

py2,py3都支持
并且伪装成前两个库
所以学习第三个pymysql

安装pymysql

pip install pymysql
如果下载慢,切换源下载,语法如下:
pip install pymysql -i https://pypi.douban.com/simple
安装好之后我们直接运行python manage.py migrate是不行的,需要将pymysql伪装成mysqlclient

伪装pymysql成mysqlclient

我们需要在程序运行前就伪装好,所以打开项目hellodjango包下的__init__.py文件


输入:

import pymysql
pymysql.install_as_MySQLdb()

之后我们再开始迁移语句python manage.py migrate
如果运行还有报错,查看以下链接解决
https://blog.csdn.net/qq_37067475/article/details/90115641

完成之后我们查看表格

迁移库优点

我们不需要重新写sql语句进行迁移,切换成oracle也可以无缝使用.

用shell进行初级测试

之前我们的测试都是用网页访问来检测我们的程序是否运行成功
我们可以用shell终端脚本来初级测试我们的程序代码运行结果
python里面不管是Django还是Flask都支持shell脚本运行

进入shell模式

终端输入
python manage.py shell

这个模式集成了Django项目的环境shell终端
通常在终端中做一些调试工作
我们查询一下two中建立的学生姓名,代码如下:

我们也可以在这里添加学生数据。

如何看待bug

看日志

先看第一条(大约是什么原因导致的,后面一系列bug都是由这里引起)
再看最后一条(总结性质的报错)

梳理思路

程序在哪一个位置和预期出现了偏差

关系型数据库讲解

表关系

1:1
1:M
M:N
外键:这张表里某一列是另外一张表的主键值,则这个列成为外键,而外键允许重复,所以做M:1关系处理
(1:1也可以做,对外键添加唯一约束),(多对多额外产生一张关系表,关系表关联两张表的主键,也就是通过两两个外键来使用)而大项目不建议外键

简单使用外键(班级学生极联)

  • 建立一个新应用,名曰:three

在models.py中添加班级与学生的模型。
学生和班级的关系是多对一,涉及到谁管理谁,假如一个班级管理很多学生,会很大程度影响速度,比如出去春游集合问题,是老师一个个把学生找回来速度快,还是定一个地点到时候让学生自己过来集合速度快?
显然是后者
所以我们再学生model中添加一个关键字段来记录所属班级。

from django.db import models

# Create your models here.
#建立一个人班级模型,并添加姓名属性g_name
class Grade(models.Model):
    g_name = models.CharField(max_length=32)
#建立一个学生模型
class Student(models.Model):
    s_name = models.CharField(max_length=16)
    s_grade = models.ForeignKey(Grade,on_delete=models.CASCADE)

版本变动:2.0之前没有on_delete选项
查看on_delete作用链接:https://www.cnblogs.com/cpl9412290130/p/9608331.html
从上面外键(ForeignKey)和一对一(OneToOneField)来看,都包含有on_delete这个参数。而且Django2.0(实验环境使用3.0)之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常: 
下面是django官方文档的说明:

这样我们班级与学生产生了级联关系

  • 将关系映射到库中生成迁移文件

terminal运行:python manage.py makemigrations生成迁移文件

  • 迁移数据至数据库

python manage.py migrate
(若迁移时报错,请看上条版本变动)

  • 在表中添加一些数据

grade表中:

student表中:

  • 需求1:给一个学生,获取学生的班级名

先写一个子路由(记得上传总路由)

from django.conf.urls import url

from three import views

urlpatterns = [
    url('getgrade/',views.get_grade()),
]

再写views函数

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from three.models import Student


def get_grade(request):
    student = Student.objects.get(pk=1)#获取学生

    grade = student.s_grade#获取学生班级
    return HttpResponse('grade %s' % grade.g_name)

然后访问网页:

通过属性来调用出班级

  • 需求2:给一个班级,将班级里的学生查出来

shift+f6   重命名,重构形式,所引用的地方也会改名
(留个大坑,这里环境越调越乱,裂开来了)

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏