蓝色的天_90  

django 连接远程的mysql8 一直报错,查看数据库链接信息均没有问题

E:\HappyAutoTest>python manage.py makemigrations autotest
Traceback (most recent call last):
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 220, in ensure_connection
    self.connect()
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
    self.connection = self.get_new_connection(conn_params)
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\mysql\base.py", line 234, in get_new_connection
    return Database.connect(**conn_params)
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\__init__.py", line 90, in Connect
    return Connection(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 704, in __init__
    self.connect()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 974, in connect
    self._request_authentication()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 1203, in _request_authentication
    auth_packet = self._read_packet()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 1059, in _read_packet
    packet.check_error()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 384, in check_error
    err.raise_mysql_exception(self._data)
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'10.20.13.38' (using password: NO)")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\management\base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\management\base.py", line 366, in execute
    self.check()
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\management\base.py", line 395, in check
    include_deployment_checks=include_deployment_checks,
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\management\base.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\core\checks\model_checks.py", line 34, in check_all_models
    errors.extend(model.check(**kwargs))
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\models\base.py", line 1275, in check
    *cls._check_constraints(),
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\models\base.py", line 1841, in _check_constraints
    connection.features.supports_table_check_constraints or
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\mysql\features.py", line 93, in supports_column_check_constraints
    if self.connection.mysql_is_mariadb:
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\mysql\base.py", line 364, in mysql_is_mariadb
    return 'mariadb' in self.mysql_server_info.lower()
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\mysql\base.py", line 351, in mysql_server_info
    with self.temporary_connection() as cursor:
  File "D:\Program Files\Python3.6\lib\contextlib.py", line 82, in __enter__
    return next(self.gen)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 604, in temporary_connection
    with self.cursor() as cursor:
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 260, in cursor
    return self._cursor()
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 236, in _cursor
    self.ensure_connection()
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 220, in ensure_connection
    self.connect()
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 220, in ensure_connection
    self.connect()
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
    self.connection = self.get_new_connection(conn_params)
  File "D:\Program Files\Python3.6\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\django\db\backends\mysql\base.py", line 234, in get_new_connection
    return Database.connect(**conn_params)
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\__init__.py", line 90, in Connect
    return Connection(*args, **kwargs)
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 704, in __init__
    self.connect()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 974, in connect
    self._request_authentication()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 1203, in _request_authentication
    auth_packet = self._read_packet()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 1059, in _read_packet
    packet.check_error()
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\connections.py", line 384, in check_error
    err.raise_mysql_exception(self._data)
  File "D:\Program Files\Python3.6\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")

经多番折腾终于找到解决的办法

更改远程连接端的mysql配置
登录mysql

mysql -u root -p
Enter password:


更改 "mysql" 数据库里的 "user" 表里的 "host" 项,将"localhost"改称"%"

mysql>update user set host = '%' where user = 'root';

 

mysql>select host, user from user;
select host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
+-----------+------------------+
4 rows in set (0.00 sec)

mysql升级到8.0之后的新特性有一条是更新了密码的加密方式。如果要用原来的Django连接mysql8.0就得将mysql的加密方式转变为原来的方式。 

也就是如果不改的话,就会出现如下报错

django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")

 更改方法

mysql>ALTER USER '用户名(一般为root)'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
mysql>FLUSH PRIVILEGES;
这时在django的setting.py里DATABASES中的‘HOST’,填入远程的IP即可
再次执行终于不报错了

django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")

E:\HappyAutoTest>python manage.py makemigrations autotest
No changes detected in app 'autotest'
E:\HappyAutoTest>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, autotest, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying autotest.0001_initial... OK
  Applying sessions.0001_initial... OK

 

posted on 2020-04-30 10:29  蓝色的天_90  阅读(2006)  评论(0编辑  收藏  举报