当我尝试使用 python 连接到我的 MySQL 数据库时,由于未知原因显示错误:
dTraceback (most recent call last):
File "/usr/local/bin/flask", line 8, in <module>
sys.exit(main())
^^^^^^
File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 1105, in main
cli.main()
File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/click/decorators.py", line 92, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 953, in run_command
raise e from None
File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 937, in run_command
app: WSGIApplication = info.load_app()
^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 335, in load_app
app = locate_app(import_name, name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 245, in locate_app
__import__(module_name)
File "/app/main.py", line 2, in <module>
import sql_code
File "/app/sql_code.py", line 4, in <module>
mydb = mysql.connector.connect(
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mysql/connector/pooling.py", line 322, in connect
return CMySQLConnection(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mysql/connector/connection_cext.py", line 151, in __init__
self.connect(**kwargs)
File "/usr/local/lib/python3.12/site-packages/mysql/connector/abstracts.py", line 1399, in connect
self._open_connection()
File "/usr/local/lib/python3.12/site-packages/mysql/connector/connection_cext.py", line 339, in _open_connection
raise get_mysql_exception(
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (99)
这些是 python 连接器的文件(针对敏感信息的审查进行了修改)
mydb = mysql.connector.connect(
host="localhost",
user="USERNAME_DATABASE",
password="root_pass",
database="mydatabase"
)
和修改后的 MYSQL 文件 (docker ):
FROM mysql:latest
WORKDIR /app
ADD . /app
COPY ./ex_db.sql /docker-entyypoint-initdb.d/
ENV MYSQL_HOST=localhost
ENV MYSQL_USER=USERNAME_DATABASE
ENV MYSQL_ROOT_PASSWORD=root_pass
ENV MYSQL_PASSWORD=pass
ENV MYSQL_DATABASE=mydatabase
EXPOSE 3306
两者都在最新版本的 docker 中运行
上面的代码应该可以无错误地连接
错误信息 "Can't connect to MySQL server on 'localhost:3306' (99)" 意味着你的 Python 代码无法连接到运行在
localhost:3306
的 MySQL 服务器。
以下是一些可能的原因和解决方法:
1. MySQL 服务未运行:
- 确保你的 MySQL 服务器正在 Docker 容器内运行。你可以使用以下命令检查:
bash
docker ps
如果 MySQL 容器没有运行,使用以下命令启动它:
bash
docker-compose up -d
-
如果你没有使用 docker-compose,可以使用以下命令启动容器:
bash docker run -d -p 3306:3306 --name some-mysql -e MYSQL_ROOT_PASSWORD=root_pass -e MYSQL_DATABASE=mydatabase -e MYSQL_USER=USERNAME_DATABASE -e MYSQL_PASSWORD=pass mysql:latest
2. 网络连接问题:
-
确保你的 Python 代码和 MySQL 容器在同一个 Docker 网络中。
-
你可以使用
docker network create my-network
创建一个新的网络。 -
然后,在启动 Python 容器和 MySQL 容器时,使用
--network my-network
选项将它们连接到同一个网络。
-
你可以使用
-
如果你没有使用 Docker 网络,请确保你的 Python 代码可以访问
localhost:3306
。-
你可以使用
telnet localhost 3306
命令测试连接。 -
如果你在不同的机器上运行代码,请将
localhost
替换为 MySQL 服务器的 IP 地址。
-
你可以使用
3. 防火墙问题:
-
确保你的防火墙没有阻止对
3306
端口的访问。 - 尝试暂时禁用防火墙,看看是否能解决问题。
4. 错误的凭据:
- 仔细检查你的 Python 代码中使用的用户名、密码和数据库名称是否与 MySQL 容器中的配置一致。
-
特别注意,你的 Python 代码应该使用
MYSQL_USER
和MYSQL_PASSWORD
环境变量的值,而不是MYSQL_ROOT_PASSWORD
。
5. MySQL 用户权限问题:
- 确保你用来连接的 MySQL 用户有权访问指定的数据库。
- 你可以使用以下命令连接到 MySQL 服务器,并检查用户权限:
bash
docker exec -it <mysql_container_id> mysql -u root -p
然后,运行以下命令查看用户权限:
sql
SHOW GRANTS FOR 'USERNAME_DATABASE'@'%';
6. 连接池问题
- 如果你使用了数据库连接池,请确保连接池配置正确,并且连接池中的连接没有被耗尽。
调试建议:
-
在你的 Python 代码中添加
print(mydb)
语句,查看连接对象是否成功创建。 -
打印连接对象的错误信息:
print(mydb.error)
。
请仔细检查以上所有步骤,并根据你的环境进行调整。
标签:python,mysql,dockerfile,localhost From: 78809644