python Mysql.connector 无法连接,但 mysql 服务器已启动并正在工作

add*_*ame 8 docker mysql-connector-python

这是 docker-compose 文件

version: '3.3'
services:
  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_DATABASE: 'bot'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: '123'
      MYSQL_ROOT_PASSWORD: 'root'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - mybot:/var/lib/mysql
  
  python:    
    restart: always
    build: .
    environment:
      MYSQL_DATABASE: 'bot'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: '123'
      MYSQL_ROOT_PASSWORD: 'root'
    volumes:
      - mybot:/usr/app
    command: tail -f /dev/null
volumes:
  mybot:
Run Code Online (Sandbox Code Playgroud)

和 Dockerfile

FROM python

user root
WORKDIR /usr/src
COPY requirements.txt ./
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 install -r requirements.txt
RUN mkdir -p new
COPY . ./new
Run Code Online (Sandbox Code Playgroud)

现在,当我从 python 容器运行 sh 终端时,我可以毫无问题地访问 mysql 数据库(在此之前我手动安装了 default-mysql-server )

mysql -u user -p -u 172.X.X.X
mysql>
Run Code Online (Sandbox Code Playgroud)

而且我能够在容器之间执行 ping 操作,没有错误,但是当我运行 main.py 时,出现以下错误

mysql.connector.errors.InterfaceError: 2055: Lost connection to MySQL server at '172.X.X.X:3306', system error: 1 [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:1123)
Run Code Online (Sandbox Code Playgroud)

main.py 像这样连接到 mysql

self.mydb = mysql.connector.connect(host=params["host"],
                                            user=params["user"],
                                            password=params["pass"],
                                            database=params["database"])
Run Code Online (Sandbox Code Playgroud)

mysql my.cnf 文件有这个自定义行

port = 3306
bind-address = 172.X.X.X
Run Code Online (Sandbox Code Playgroud)

“外部”docker 容器,一切都很好..谢谢!

Neo*_*son 8

这似乎是某些版本中出现的 mysql-connector 中的错误。
解决此问题的最简单方法是切换到 pymysql

安装 pymysql

pip install pymysql
Run Code Online (Sandbox Code Playgroud)

简单选择示例:

import pymysql

connection = pymysql.connect(user='user', passwd='pass', host='host', database='database')
cursor = connection.cursor()
query = ("SELECT * FROM myTable")
cursor.execute(query)
for item in cursor:
    print item
Run Code Online (Sandbox Code Playgroud)