【问题标题】:python mysql.connector module uses wrong IP addresspython mysql.connector模块使用了错误的IP地址
【发布时间】:2019-07-21 18:23:37
【问题描述】:

在脚本中使用 python mysql.connector 模块时遇到问题。当我从我的脚本运行连接到运行 mysql v8 的 docker 容器时,它会尝试连接到错误的 IP 地址。下面是示例函数:

import mysql.connector
def connect():
    db =  mysql.connector.connect(
        host="172.17.0.2",
        user="user",
        passwd="password",
        auth_plugin='mysql_native_password')

运行时,会产生以下错误: mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user 'user'@'172.17.0.1' (using password: YES)

这是我尝试连接的 docker 容器的 IP

IP地址": "172.17.0.2"

真正有趣的是,在交互式 python 会话中使用时,我可以使用 mysql.connector 很好地连接到数据库。见下文

Python 3.7.2 (default, Jan 16 2019, 19:49:22) 
[GCC 8.2.1 20181215 (Red Hat 8.2.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mysql.connector
>>> db =  mysql.connector.connect(
... host="172.17.0.2",
... user="user",
... passwd="passwd",
... auth_plugin='mysql_native_password')
>>> mycursor =  db.cursor()
>>> mycursor.execute("show databases")
>>> for x in mycursor: print(x)
... 
('food',)
('information_schema',) 

这是我在 Fedora 29 上运行的 mysql-connector 版本

pip list |grep mysql-connector
mysql-connector-python 8.0.15       

这里还有 docker 版本信息

Client:
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.6
 Git commit:        6247962
 Built:             Sun Feb 10 04:13:54 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 03:47:25 2019
  OS/Arch:          linux/amd64
  Experimental:     false

有什么想法会导致从脚本运行它失败吗?

【问题讨论】:

  • 您是从不同的 Docker 容器还是从主机运行脚本?
  • 我正在从主机运行脚本。我是 vim 的粉丝,所以从命令行使用 vim 和 virtualenv 编写脚本。我后来下载了 pycharm 并从 pycharm 的 pip repo 安装了 mysql-connector-python 并且无法重现此错误。我认为这可能是 virtualenv 的问题?

标签: python mysql docker ip


【解决方案1】:

脚本不会尝试连接到错误的 IP。错误信息

mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user 'user'@'172.17.0.1' (using password: YES)

意味着通过此主机172.17.0.1 的此用户user 将无法连接到您尝试在172.17.0.2 访问的数据库。 您需要做的是从主机172.17.0.1 为该用户user 发送allow remote MySQL connection,这将使脚本能够按预期工作。

更新: 不确定这是否相关,但python脚本显示密码为password,控制台显示密码为passwd。如果已经允许远程访问,请确保您输入的密码正确

【讨论】:

  • 但有趣的是,在 172.17.0.1 上没有运行 IP,那么为什么我的脚本会尝试连接到不存在的 IP?我还想指出,我认为在我的 virtualenv 中下载的 pip 包一定存在问题。后来我下载了pycharm并从pycharms repo下载了mysql-connector-python,并且能够连接到正确的IP。
  • 此 ip 172.17.0.1 是您启动脚本的 ip(源 ip)而不是您托管数据库的目标 ip
  • python 脚本在这里 (172.17.0.1) ----> 数据库在这里 (172.17.0.2)。所以数据库需要通过允许远程连接来授权源ip
  • 如果你在宿主机上执行ifconfig你会注意到它的ip是写在docker0接口的172.17.0.1。所以你正试图通过docker0 从你的主机连接到容器
  • 好眼力....我真的不敢相信我没有注意到这一点。我更改了模块中的代码并且能够连接。感谢您给予我额外的关注,并与我一起解决这个问题。
猜你喜欢
  • 2021-10-27
  • 2021-08-24
  • 2013-04-26
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2019-11-01
相关资源
最近更新 更多