python Mysql.connector 没有连接但是 mysql 服务器已启动并工作
python Mysql.connector doesn´t connect BUT mysql server is up and working
这是 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:
和 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
现在,当我从 python 容器 运行 sh 终端时,我可以毫无问题地访问 mysql 数据库(在此之前我手动安装了 default-mysql-服务器)
mysql -u user -p -u 172.X.X.X
mysql>
而且我能够在容器之间 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)
main.py 正在像这样连接到 mysql
self.mydb = mysql.connector.connect(host=params["host"],
user=params["user"],
password=params["pass"],
database=params["database"])
和mysql my.cnf 文件有这个自定义行
port = 3306
bind-address = 172.X.X.X
“外部”docker 容器,一切正常..
谢谢!
这似乎是 mysql-connector 中的一个错误,出现在某些版本中。
解决此问题的最简单方法是切换到 pymysql
安装 pymysql
pip install pymysql
简单select示例:
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
我已经用上面的 Docker 配置进行了测试,我能够连接:
root@bf838ebaa060:/usr/src# pip list
Package Version
---------------------- -------
mysql-connector-python 8.0.21
pip 20.1.1
protobuf 3.12.2
setuptools 49.2.0
six 1.15.0
wheel 0.34.2
root@bf838ebaa060:/usr/src# cat test.py
import mysql.connector
config = {
"host": "172.x.x.x",
"port": 3306,
"user": "root",
"password": "root"
}
cnx = mysql.connector.connect(**config)
cur = cnx.cursor()
cur.execute("SELECT VERSION()")
res = cur.fetchone()
print(res)
cur.close()
cnx.close()
root@bf838ebaa060:/usr/src# python test.py
('8.0.21',)
免责声明:我是 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:
和 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
现在,当我从 python 容器 运行 sh 终端时,我可以毫无问题地访问 mysql 数据库(在此之前我手动安装了 default-mysql-服务器)
mysql -u user -p -u 172.X.X.X
mysql>
而且我能够在容器之间 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)
main.py 正在像这样连接到 mysql
self.mydb = mysql.connector.connect(host=params["host"],
user=params["user"],
password=params["pass"],
database=params["database"])
和mysql my.cnf 文件有这个自定义行
port = 3306
bind-address = 172.X.X.X
“外部”docker 容器,一切正常.. 谢谢!
这似乎是 mysql-connector 中的一个错误,出现在某些版本中。
解决此问题的最简单方法是切换到 pymysql
安装 pymysql
pip install pymysql
简单select示例:
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
我已经用上面的 Docker 配置进行了测试,我能够连接:
root@bf838ebaa060:/usr/src# pip list
Package Version
---------------------- -------
mysql-connector-python 8.0.21
pip 20.1.1
protobuf 3.12.2
setuptools 49.2.0
six 1.15.0
wheel 0.34.2
root@bf838ebaa060:/usr/src# cat test.py
import mysql.connector
config = {
"host": "172.x.x.x",
"port": 3306,
"user": "root",
"password": "root"
}
cnx = mysql.connector.connect(**config)
cur = cnx.cursor()
cur.execute("SELECT VERSION()")
res = cur.fetchone()
print(res)
cur.close()
cnx.close()
root@bf838ebaa060:/usr/src# python test.py
('8.0.21',)
免责声明:我是 MySQL Connector/Python 的首席开发人员。如果它仍然不适合您,请告诉我。