关于Django中连接mysql数据库报错的解决方法:RuntimeError: ‘cryptography’ package is required for sha256_password or caching_sha2_password auth methods
一、问题发现
安装MySQL8的条件下,在Django中连接MySQL数据库时会发生如下错误:
1 | 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
- windows下安装的MySQL8客户端,打开MySQL 8.0 Command Line Client

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

安装’cryptography’(最简单,推荐使用)
有虚拟环境的先进虚拟环境
conda activate ***,没有虚拟环境的直接在命令行窗口中敲如下代码pip install cryptography使用DBeaver的用户在设置中的驱动属性allowPublicKeyRetrieval改为True**(每次重启电脑后都需要重新设置一次,不推荐)**
- 右击localhost点击编辑连接

修改驱动属性allowPublicKeyRetrieval改为True

- 重新连接,点击是
