(2059,“身份验证插件 'caching_sha2_password'”)当 运行 服务器连接到 Django 上的 MYSQL 数据库时

(2059,“Authentication Plugin 'caching_sha2_password'”) when running server connected with MYSQL database on Django

我想配置我的 django 项目,以便将它与 MYSQL 中的数据库连接,我用 workbench 8.0,
然后我想 运行 服务器 运行ning

python manage.py runserver

来自 anaconda 命令提示符,
这样我就可以使用 Django 界面来可视化和更改数据。
请注意,我不想降级 workbench 8.0。

这些是我所做的步骤:

来自 anaconda 提示:

pip install mysqlclient

在我的项目文件夹中,在 settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'schema_meta',
        'USER': 'root',
        'PASSWORD': '<mypassword>',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
}

在 mysql 服务器的目录中,我打开 cnf.ini 并插入 [client] 部分:

[client]
database=schema_meta
host=127.0.0.1
user=root
password=<mypassword>
port=3306
default-character-set = utf8

然后从 anaconda 提示我 运行

Python manage.py runserver

我得到错误

django.db.utils.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: Impossibile trovare il modulo specificato.\r\n")

所以我尝试通过以下线程解决它:
django.db.utils.operationalError: (2059,"Authentication Plugin 'caching_sha2_password'")

我打开 mysql workbench 并且我 运行 这个查询:

delete from mysql.user
where user='root'
and host = '127.0.0.1';
flush privileges;
CREATE  USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '<mypassword>';

然后,我在 my.ini 文件中更改

default-authentication-plugin= caching_sha2_password

default-authentication-plugin=mysql_native_password

最后来自 anaconda 提示:

python manage.py runserver

但我又得到了

django.db.utils.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: Impossibile trovare il modulo specificato.\r\n")

现在,怎么了?为什么它没有将更改更改为身份验证方法?

为了检查没有其他错误,从 mysql workbench,从第一个“主页”视图,我右键单击我的数据库,打开“编辑连接”,我点击“测试连接”,软件提示连接成功

mysql workbench saying connection successfully established

此外,我想检查问题是否出在我的 Django 设置中。 所以从 anaconda 提示我 运行

pip install pymysql

然后在项目文件夹中我创建了一个“connect_to_mysql.py”脚本,里面有以下代码:

import pymysql.cursors
mydb = pymysql.connect(host='127.0.0.1',
                             user='root',
                             password='<mypassword>',
                             db='schema_meta',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)
print(mydb)

这似乎工作正常,因为当我 运行

connect_to_mysql.py 

从蟒蛇,我得到

pymysql.connections.Connection object at 0x000002013F2851D0

我猜是“连接成功建立”的意思。
为了确保问题出在 mysql(我猜是 mysql 连接器),我创建了一个文件“connect_to_mysql_2.py”,其中包含以下代码:

import mysql.connector
mydb = mysql.connector.connect(user='root', password='<mypassword>',
                             host='127.0.0.1', database='meta_schema')
print(mydb)

当我从 anaconda 运行 它时,我再次得到

"Authentication plugin '{0}' is not supported".format(plugin_name)) mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported

这意味着我在 mysql workbench 和 my.ini 文件中没有修复任何问题。

如何让我的 Django 连接到我的 mysql 数据库和我的服务器 运行ning?

有没有办法使用 pymysql 连接器而不是 mysql 连接器来建立服务器连接器?

这可能不是您的 python 代码中的问题,而是 python 连接器中的问题。 caching_sha2_password 插件现在是默认的 auth 插件,客户端必须支持它才能连接。因此,最好的解决方案是更新您的 python 连接器。另一种方法是禁用此插件,但我不建议这样做,因为它会降低服务器的安全性。

我想我解决了。

通过关注此话题

在 settings.py 中,我在 DATABASES 条目处替换了

'ENGINE': 'django.db.backends.mysql'

'ENGINE': 'mysql.connector.django',

再次,如此处所述,

https://django-mysql.readthedocs.io/en/latest/checks.html#django-mysql-w003-utf8mb4

我也加了

'OPTIONS': {
            # Tell MySQLdb to connect with 'utf8mb4' character set
            'charset': 'utf8mb4',
        },
        # Tell Django to build the test database with the 'utf8mb4' character set
        'TEST': {
            'CHARSET': 'utf8mb4',
            'COLLATION': 'utf8mb4_unicode_ci',
        }

然后如果我 运行

python manage.py runserver

它似乎有效,即使我无法访问 http://127.0.0.1:8000/admin ,因为我连接到旧数据库,所以我仍然需要检查数据库和我仍然需要学习的东西。

作为连接正在工作的第二个证据,当我 运行

connect_to_mysql_2.py

(见

我终于明白了

mysql.connector.connection_cext.CMySQLConnection object at 0x000001DFB7521550

所以我真的认为这次连接已经打开。

PyMySQL 在 0.9.0 中添加了对 caching_sha2_password 的支持,尽管在 0.9.1 中修复了 Py2 错误。

也在 install instructions 中注明,对于 caching_sha2_password 还有额外的要求:

python3 -m pip install PyMySQL[rsa]