关于Django中连接mysql数据库报错的解决方法

关于Django中连接mysql数据库报错的解决方法:RuntimeError: ‘cryptography’ package is required for sha256_password or caching_sha2_password auth methods

一、问题发现

安装MySQL8的条件下,在Django中连接MySQL数据库时会发生如下错误:

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\core\management\commands\runserver.py", line 120, in inner_run
    self.check_migrations()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\core\management\base.py", line 453, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\migrations\loader.py", line 49, in __init__
    self.build_graph()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\migrations\loader.py", line 212, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
    if self.has_table():
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\migrations\recorder.py", line 56, in has_table
    return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\backends\base\base.py", line 256, in cursor
    return self._cursor()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\backends\base\base.py", line 233, in _cursor
    self.ensure_connection()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\backends\base\base.py", line 217, in ensure_connection
    self.connect()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\backends\base\base.py", line 195, in connect
    self.connection = self.get_new_connection(conn_params)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\django\db\backends\mysql\base.py", line 227, in get_new_connection
    return Database.connect(**conn_params)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\pymysql\__init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\pymysql\connections.py", line 327, in __init__
    self.connect()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\pymysql\connections.py", line 588, in connect
    self._request_authentication()
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\pymysql\connections.py", line 874, in _request_authentication
    auth_packet = _auth.caching_sha2_password_auth(self, auth_packet)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\pymysql\_auth.py", line 326, in caching_sha2_password_auth
    data = sha2_rsa_encrypt(conn.password, conn.salt, conn.server_public_key)
  File "C:\Users\zqchen7\Anaconda3\envs\dev_2.2_3.6\lib\site-packages\pymysql\_auth.py", line 204, in sha2_rsa_encrypt
    raise RuntimeError("'cryptography' package is required for sha256_password or caching_sha2_password auth methods")
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods

二、问题分析

原因是从MySQL8开始后使用新的加密方式 caching-sha2-password,而之前使用的加密方式为mysql_native_password,因此hi存在不兼容的情况。

三、问题解决

汇总网上现有的方法共计三种解决方案(三选一即可):

  • 把root用户的密码加密方式改为mysql_native_password
  1. windows下安装的MySQL8客户端,打开MySQL 8.0 Command Line Client

在这里插入图片描述

  1. 输入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';更新一下用户的密码为1234,密码可以按照自己的需求进行更改。

  2. 刷新权限FLUSH PRIVILEGES; #刷新权限

在这里插入图片描述

  • 安装’cryptography’(最简单,推荐使用)

    有虚拟环境的先进虚拟环境conda activate ***,没有虚拟环境的直接在命令行窗口中敲如下代码

    pip install cryptography

  • 使用DBeaver的用户在设置中的驱动属性allowPublicKeyRetrieval改为True**(每次重启电脑后都需要重新设置一次,不推荐)**

  1. 右击localhost点击编辑连接

在这里插入图片描述

  1. 修改驱动属性allowPublicKeyRetrieval改为True
    在这里插入图片描述

  2. 重新连接,点击是

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值