当前位置: 首页 > news >正文

Django3.2.14Mysql数据库操作与主从架构搭建【亲测可用】

mysql安装:pip3 install mysqlclient

如果安装出错,请到百度查询mysqlcilent wheel,找到mysqlclient.PyPI这个网站,然后根据Python版本进行下载安装。

1、创建数据库

(1)在命令行里输入mysql -uroot -p,然后输入你的Mysql密码

(2)create database TestMysqlDate charset=utf8;查询所有库:show databases;删除库:drop database 数据库名;

2、Django连接数据库,去项目下面的settings.py文件里的DATABASES进行修改。

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'demo_db',
        'USER': 'root',
        'PASSWORD': 'Newmysql55..',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

3、建立Mysql链接出现的所有错误

(1)Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon'

解决方法如下:在mysql命令模式下输入:set global time_zone='+8:00';就可以了。

(2)执行python manage.py migrate 命令进行文件迁移,这时控制台会报以下错误:

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3

按照下面两个方法进行解决(2.0-2.2.7需要按照A、B方法改,3.0.3只需要修改A)

A:找到控制台的base.py文件或找到以下目录:

/venv/lib/site-packages/django/db/backends/mysql/base.py

把一下代码进行注释:

if version < (1, 3, 13):

raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

B:找到控制台的operations.py文件,或找到以下目录:

venv\lib\site-packages\django\db\backends\mysql\operations.py

把query = query.decode(errors='replace')改成query = query.encode(errors='replace')

(3)如果出现版本身份验证错误就是下面的错误提示:

RuntimeError: cryptography is required for sha256_password or caching_sha2_password

就去安装这个:pip3 install cryptography

4、主从架构搭建(setting.py文件下配置)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'StoreHouse_Data',
        'USER': 'root',
        'PASSWORD': 'Newmysql55..',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
    'slave': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'storeHouse_data',
        'USER': 'root',
        'PASSWORD': 'Newmysql55..',
        'HOST': '192.168.170.1',
        'PORT': '3306',
    }
}

# 在最下面配置自动读写分离数据库
class DefaultRouter:
    # 写数据
    def db_for_write(self, model, **hints):
        return 'default'

    # 读数据
    def db_for_read(self, model, **hints):
        return 'slave'

(1)数据迁移文件

1、生成迁移文件:python3 manage.py makemigrations

2、迁移文件生成表:python3 manage.py migrate --database default

3、迁移文件生成表:python3 manage.py migrate --database slave

如在迁移从数据库在控制台出现:is not allowed to connect to this MySQL server。就要去你的从数据库把数据库远程访问进行开启:

方法1:找到mysql数据库找到user表,把root用户那行的localhost更改为“%”后重启你的数据库即可,然后再进行迁移从数据库。

方法2:在控制台下进行登录:mysql -u root -p

创建远程登录用户:CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';

授权用户远程登录权限:grant all on *.* to 'root'@'%';

刷新配置:flush privileges;

(2)读写分离

手动读写分离
在使用ORM 调用数据库时,通过.using(db_name)来手动指定要使用的数据库

StoreHouse_Manager.objects.using('default'):写入

StoreHouse_Manager.objects.using('slave1'):读取

(3)自动读写分离

通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个:def db_for_read()决定读操作的数据库,def db_for_write()决定写操作的数据库。

(4)读写分离mysql数据库配置

主库配置:

编辑my.cnf,添加如下代码:

  1. [mysqld]
  2. log-bin=mysql-bin
  3. server-id=1

进入mysql控制台,创建用于复制操作的账户

mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> flush privileges;
mysql> SHOW MASTER STATUS;

从库配置:

编辑my.ini配置文件,添加如下代码:

(linux在etc\my.cnf文件里,windows在C:\ProgramData\MySQL\MySQL Server 8.0\my.ini文件里进行修改)

  1. [mysqld]
  1. log-bin=mysql-bin
  1. server-id=2
  2. 重启MySQL 服务
mysql> CHANGE MASTER TO
 MASTER_HOST='192.168.141.128',
 MASTER_USER='repl',
 MASTER_PASSWORD='repl',
 ‘这里的名称一定要和上面的File里的文件名一致’
 MASTER_LOG_FILE='binlog.000006',
 MASTER_LOG_POS=856;

这里的000006和856对应上面的图片,必须是一样的数据

参数说明:master_host =主库地址, master_user= 主库创建同步账户,master_password=主库创建同步账户密码,master_log_file=日志文件名称,master_log_pos=日志文件位置

开启主从同步:mysql>start slave;

查看主从同步状态:mysql>show slave status\G

只需要关注这两个参数是否为Yes,其他状态No,connecting均代表有错误!

mysql文件默认地址:

windows:C:\ProgramData\MySQL\MySQL Server 8.0

linux:var/lib/mysql/

如出现错误解决方法如下:

1、Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not open log file'

解决方法:主库:

mysql> flush logs; (记住file和position这两个选项)

show master status;

从库:

mysql> stop slave;

mysql> change master to master_log_file ='dbmaster-bin.000005',master_log_pos=120;(对应上面file和position的值)

mysql> start slave;

mysql>show slave status\G

相关文章:

  • 防止死锁,一定要给锁加过期时间
  • 实验 gazebo_ros_control
  • freeswitch三、开启视频通话功能
  • python中的列表对象
  • POC(客户验证性测试)项目中关于性能测试的一些心得
  • react扩展(一些单独技术点)
  • 多媒体相关的计算和种类
  • Vue项目实战——实现一个任务清单【基于 Vue3.x 全家桶(简易版)】
  • 分布式架构简述
  • 跨平台应用开发进阶(三十四) :uni-app 实现微信分享
  • 丙烯酸酯-聚乙二醇-羧基,AC-PEG-COOH,Acrylate-PEG-Acid一种带PEG间隔基的交联剂
  • Vue基本原理
  • 【MySql】mysql之主从复制和读写分离搭建
  • Python读取csv文件(super详细简单版)
  • 前端开发node.js、vue安装环境【安装node版本管理工具-nvm,耗时一天时间踩坑总结】
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 08.Android之View事件问题
  • Django 博客开发教程 16 - 统计文章阅读量
  • Java比较器对数组,集合排序
  • Java应用性能调优
  • JDK9: 集成 Jshell 和 Maven 项目.
  • node学习系列之简单文件上传
  • ViewService——一种保证客户端与服务端同步的方法
  • 分布式事物理论与实践
  • 高度不固定时垂直居中
  • 基于遗传算法的优化问题求解
  • 盘点那些不知名却常用的 Git 操作
  • 如何合理的规划jvm性能调优
  • 深度解析利用ES6进行Promise封装总结
  • 试着探索高并发下的系统架构面貌
  • 算法之不定期更新(一)(2018-04-12)
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 移动端唤起键盘时取消position:fixed定位
  • 06-01 点餐小程序前台界面搭建
  • UI设计初学者应该如何入门?
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #if #elif #endif
  • #预处理和函数的对比以及条件编译
  • (06)金属布线——为半导体注入生命的连接
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (33)STM32——485实验笔记
  • (C)一些题4
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (python)数据结构---字典
  • (附源码)springboot教学评价 毕业设计 641310
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (论文阅读11/100)Fast R-CNN
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)程序员疫苗:代码注入
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别