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

Posted 叼奶嘴的超人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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连接数据库

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'

在最下面配置自动读写分离数据库 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('slave'):读取

(3)自动读写分离

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

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

主库配置:
修改主数据库的 mysql 配置文件,vim /etc/my.cnf 添加如下代码:
[mysqld]
log-bin=mysql-bin
server-id=1
log-bin=master-log
然后重启MySQL服务
进入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;

从库配置:
修改从数据库的 mysql 配置文件,vim /etc/my.cnf 添加如下代码:
(windows在C:\\ProgramData\\MySQL\\MySQL Server 8.0\\my.ini文件里进行修改)

[mysqld]
log-bin=mysql-bin
server-id=2
log-bin=slave-log


(5) 重启Mysql服务

mysql> CHANGE MASTER TO MASTER_HOST='192.168.41.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

2、如果出现以下错误

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

解决方法:
查看两个数据库的server_id的值是否一样
show variables like 'server_id';
如果一样,需要您把从服务器的server_id的值进行改变
set global server_id=2;

django+mysql学习笔记

这段时间在学习mysql+django的知识点。借此记录以下学习过程遇到的坑以及心得。

使用的工具是navicat for mysql

python 2.7.12

mysql-python 1.2.3 。

 

首先在次目录下新建一个数据库(students_info),记下用户名,密码,端口。。。。。。此数据库后续会在settings.py中进行对接。

django与database对接的操作流程:

1、你得先告诉django数据库的相关信息,后续框架会自动去根据这些信息访问数据库不用你操心了。

代码如下:

DATABASES = {
 ‘default‘:
 {
  ‘ENGINE‘:‘django.db.backends.mysql‘,
  ‘NAME‘:‘students_info‘,
  ‘USER‘:‘root‘,
  ‘PASSWORD‘:‘123456‘,
  ‘HOST‘:‘127.0.0.1‘,
  ‘PORT‘:‘3306‘,
 }
}

以上就是在settings.py中的设置,没错就这么简单。ENGINE根据各种数据库不同可以参照官方文档https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-DATABASES。

2、定义数据模型,这工作是在对应的app(blog)应用目录下的model.py中完成的。例子如下(djangobook例子):

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

 每个class会对应一个表。

 3、接下来就是运行 python manage.py makemigrations blog

   然后运行 python manage.py migrate

如果是第二次运行有问题,可以把blog/migrates下的0001_initial.py删除再重新运行以上两个命令。

4、如果没问题,既可以再navigcat中看到创建的表。

 











以上是关于Django3.2.14Mysql数据库操作与主从架构搭建亲测可用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL主从复制与读写分离解析和图文详细步骤

Mysql读写分离与主从数据库设置方案

搭建 MySQL主从复制与读写分离

MySQL 主从复制与读写分离概念及架构分析

MySQL主从复制与读写分离

MySQL 主从复制与读写分离 部署